From 0d6cd21fde8df8d10a7fc4ce99990ebc9a66c8d6 Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Wed, 27 Oct 2004 18:45:56 +0000 Subject: [PATCH] Unreal3.2.2 --- .CHANGES.NEW | 2 +- .RELEASE.NOTES | 164 +- Changes | 167 + Unreal.nfo | 2 +- aliases/aliases.conf | 12 +- aliases/anope.conf | 13 +- aliases/auspice.conf | 12 +- aliases/cygnus.conf | 8 +- aliases/epona.conf | 12 +- aliases/generic.conf | 10 +- aliases/genericstats.conf | 2 +- aliases/ircservices.conf | 12 +- aliases/operstats.conf | 4 +- autoconf/configure.in | 2 +- configure | 2 +- doc/compiling_win32.txt | 160 +- doc/example.conf | 90 +- doc/technical/005.txt | 55 +- doc/technical/token.txt | 151 +- doc/technical/vl.txt | 1 + doc/translations.txt | 3 + doc/unreal32docs.de.html | 248 +- doc/unreal32docs.es.html | 5906 ++++++++++++++++++------------------ doc/unreal32docs.fr.html | 3202 +++++++++++++++++++ doc/unreal32docs.html | 105 +- doc/unreal32docs.hu.html | 447 +-- extras/defizzer.c | 37 +- extras/tre.tar.gz | Bin 404346 -> 417393 bytes help.conf | 79 +- include/auth.h | 7 +- include/common.h | 66 +- include/config.h | 35 +- include/h.h | 5 + include/macros.h | 23 + include/modules.h | 17 + include/msg.h | 1 - include/numeric.h | 5 +- include/struct.h | 28 +- include/version.h | 6 +- include/win32/regex.h | 105 +- include/win32/tre-config.h | 32 +- makefile.win32 | 41 +- src/Makefile | 8 +- src/api-command.c | 149 + src/api-isupport.c | 271 ++ src/auth.c | 657 ++-- src/badwords.c | 7 +- src/channel.c | 26 +- src/cloak.c | 4 +- src/extbans.c | 14 +- src/extcmodes.c | 15 +- src/ircd.c | 16 +- src/ircsprintf.c | 22 - src/md5.c | 1 + src/modules.c | 17 +- src/modules/Makefile.in | 340 ++- src/modules/cloak.c | 6 + src/modules/l_commands.c | 9 +- src/modules/m_away.c | 10 +- src/modules/m_dccallow.c | 8 +- src/modules/m_kick.c | 2 + src/modules/m_knock.c | 7 +- src/modules/m_map.c | 7 +- src/modules/m_message.c | 7 +- src/modules/m_oper.c | 32 +- src/modules/m_sapart.c | 58 +- src/modules/m_sjoin.c | 7 +- src/modules/m_svsjoin.c | 2 +- src/modules/m_svso.c | 2 +- src/modules/m_svspart.c | 17 +- src/modules/m_svswatch.c | 2 +- src/modules/m_userip.c | 140 + src/modules/m_vhost.c | 4 +- src/modules/m_who.c | 34 +- src/modules/m_whois.c | 18 +- src/packet.c | 79 - src/res.c | 120 +- src/res_init.c | 19 +- src/s_bsd.c | 7 +- src/s_conf.c | 325 +- src/s_err.c | 8 +- src/s_kline.c | 53 +- src/s_misc.c | 21 +- src/s_serv.c | 22 +- src/s_svs.c | 97 +- src/s_user.c | 111 +- src/send.c | 7 +- src/umodes.c | 2 + src/win32/Win32GUI.c | 2540 ---------------- src/win32/debug.c | 146 +- src/win32/editor.c | 777 +++++ src/win32/gui.c | 1080 +++++++ src/win32/rtf.c | 883 ++++++ src/win32/service.c | 133 +- src/win32/tre.dll | Bin 114688 -> 151552 bytes src/win32/tre.lib | Bin 2810 -> 3798 bytes src/win32/unreal.c | 6 +- src/win32/unrealinst.iss | 22 +- src/win32/win32.c | 72 + src/win32/win32.h | 40 + wircd.def | 22 +- 101 files changed, 12746 insertions(+), 7044 deletions(-) create mode 100644 doc/unreal32docs.fr.html create mode 100644 include/macros.h create mode 100644 src/api-command.c create mode 100644 src/api-isupport.c create mode 100644 src/modules/m_userip.c delete mode 100644 src/win32/Win32GUI.c create mode 100644 src/win32/editor.c create mode 100644 src/win32/gui.c create mode 100644 src/win32/rtf.c create mode 100644 src/win32/win32.c create mode 100644 src/win32/win32.h diff --git a/.CHANGES.NEW b/.CHANGES.NEW index fe1a4331b..5d9834b7f 100644 --- a/.CHANGES.NEW +++ b/.CHANGES.NEW @@ -7,7 +7,7 @@ \___/|_| |_|_| \___|\__,_|_|\___/\_| \_| \____/\__,_| Configuration Program - for Unreal3.2.1 + for Unreal3.2.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 3e1fa2e1a..075563bb9 100644 --- a/.RELEASE.NOTES +++ b/.RELEASE.NOTES @@ -1,113 +1,91 @@ -Unreal3.2.1 Release Notes +Unreal3.2.2 Release Notes ========================== -Please READ this document carefully, otherwise your ircd won't boot! - -This is a RECOMMENDED RELEASE due to the fact that the previous -cloaking algorithm has been cracked. Besides that, this version -also brings quite some exciting new features (win32 module support, -and a _lot_ more). - ==[ GENERAL INFORMATION ]== -- If you are upgrading on *NIX, make sure you run make clean and ./Config before doing make +- If you are upgrading on *NIX, make sure you run 'make clean' and './Config' + first 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/ +- When upgrading a network, we assume you are upgrading from the previous + version (3.2.1). If you got a net running with servers that are several + versions behind (eg: 3.2) then you might experience (desynch) problems. + Also, if you try to use the new features, some might not work properly + until all your servers are upgraded. It is therefore recommended to + upgrade all servers in a 'short' timespan (x day[s], not weeks). == [ NEW ]== -- [!] Cloaking has been modulized. - - This means you now MUST load a cloaking module in order to boot. - Example: loadmodule "src/modules/cloak.so"; - - 2 cloaking modules are provided: 'cloak' and 'oldcloak': - - 'cloak' is the new, RECOMMENDED, and much more secure cloaking algorithm that uses - md5 internally. It requires 3 keys of 5-100 characters (10-20 is fine) consisting - of mixed lowercase (a-z), uppercase (A-Z) and digits (0-9). So for example: - set { cloak-keys { "AHsHS6ds2sQGAkish"; "qF5D3orm6Evba26hjf"; "f6oaO2hhd6sIHSfs"; }; - - 'oldcloak' is the <=3.2 cloaking algorithm, it is ONLY meant for use during the - upgrade process (it will give a warning if you use it), you should switch to the - much more secure 'cloak' module AS SOON AS POSSIBLE. As mentioned earlier, the old - cloaking algorithm has been cracked so it makes no sense to keep using it. - - 3rd party cloak modules are also possible. -- [!] Windows now also supports modules - - This means you MUST load commands.dll and a cloaking module on windows too, eg: - loadmodule "modules/commands.dll"; - loadmodule "modules/cloak.dll"; - - 3rd party modules are now easy to install too... developers can put .dll files - online which you just need to put in your modules\ directory (or, that could - even be done by an installer), after that you just add a loadmodule line for it, - like: loadmodule "modules/leetmod.dll"; - NOTE: Just as on *NIX, you'll have to upgrade your modules every release. -- set::spamfilter::virus-help-channel-deny: blocks any normal joins to the - virus-help-channel (only people force-joined by spamfilter and opers can join). -- set::options::flat-map: Makes all server appear as directly-linked in /links, - /map, etc. Thus, link info (which server is linked to which) is hidden from users. -- NickIP was added, this means IP's of users are now known by all servers: - - IP is now shown in the 'is connecting from' line in /whois (if selfwhois or oper) - - "Far connects" (+s +F) together with HCN (Hybrid Connect Notice) can now see - IP's as well. This allows you to use for example 1 central BOPM. - - New /who options: - - /who +i allows you to search by IP (eg: /who +i 10.*) - - /who +I will show IP's of everyone (bit like /who +R) -- Added DCCALLOW system (taken from bahamut). With this system you can block certain - (or all) DCC SENDs and then allow the user to 'override' this limit for every user - he/she trusts via '/DCCALLOW +User'. This is an attempt to stop (or at least limit) - the spreading of viruses and other malware. - - added deny dcc::soft option, if 'soft' is set to yes in a deny dcc block it means - users can override it via DCCALLOW. - - set::maxdccallow controls the max. number of items on the DCCALLOW list (default:10) -- Added allow dcc { } by which you can make certain exceptions over deny dcc { } -- Added extended ban type ~n (nickchange ban). if a user matches this (s)he can not - change nicks unless (s)he has voice or higher (ex: +b ~n:*!*@*.aol.com). -- Added set::restrict-extendedbans by which you can disallow normal users to use any - extended bans ("*") or disallow only certain ones (eg: "qc"). - You could also use this if you are on a mixed-version-network and are (very) concerned - about desynchs, then you could restrict 'n' till all servers are upgraded. -- Added CIDR support (eg: 192.168.0.0/16). Now implemented for: ban ip, ban user, - allow, except ban/tkl/throttle, and TKL (*lines). -- '/dns c' will clear the DNS cache -- Added new logtype 'spamfilter' to log spamfilter matches. -- Added 'can_addline' operflag, this is now required in order to use /addline. -- Spanish and Hungarian translations of unreal32docs were added. -- Readded support for the T (topic time) and C (creation time) flags for /list. -- Added support for the ELIST 005 token (ELIST=MNUCT) +- set::hosts now supports the user@host format (ident) +- oper::modes: set individual modes on oper-up, overrides set::modes-on-oper +- SAPART and SVSPART reasons +- USERIP command: works just like USERHOST but displays (cloaked) IPs instead. +- Salted passwords: md5/sha1/ripemd160 passwords generated by mkpasswd are + now 'salted' which makes some cracking techniques a lot harder. + Additionally, 'md5' password encryption is now always available on *NIX. +- Channel aliases: Ability for alias { } blocks to send to a channel, + useful for example for a /SPAMREPORT command. +- Added spamfilter 'user' ('u') target, this gets matched against the + nick!user@host:realname mask of every user. + Ex: /spamfilter add u gzline 86400 Please_go_away Drone[0-9]+!.+@.+:Drone[0-9] + This would gzline any users that have both a nick and realname with 'Drone' + followed by digits. +- Added spamfilter 'away' ('a') target. +- Oper-up notices moved to a new snomask 'o' +- Win32: can now handle (near) 4096 connections instead of 1024. +- French docs +- Module coders: HOOKTYPE_REMOTE_JOIN, HOOKTYPE_REMOTE_PART, HOOKTYPE_REMOTE_KICK ==[ MAJOR BUGS FIXED ]== -- win32: crash bugs in TRE on /rehash are probably fixed. -- qlines (banned nicks) could cause crashes +- Memory corruption bug in qlines +- Crash on first connect if compiled with SSL enabled on: Mac OS X, Sun + Solaris, Opteron w/Linux, and perhaps others (non-i386). - (quickly) rehashing + autoconnect link blocks could cause a crash -- The previous cloaking algorithm had some serious flaws by which the cloak keys - could be discovered. Thus, enabling an attacker to 'uncloak' any hosts (especially - unresolved IP's but probably also normal hosts with some more effort). +- Win32: using 100% cpu on startup in some cases [*] +- Win32: crash on windows 2003 when installing [*] +- IPv6: various nameserver fixes: hosts in link::hostname are now working, + also resolving of hostnames of clients should now work as expected (this + mainly affected non-BIND nameservers). +- new TRE version v0.7.0 fixes (invalid) regex crash +- Too broad regex in badword::word caused the ircd to hang +- Win32: remote include bug could cause a crash [*] ==[ MINOR BUGS FIXED ]== -- GUEST support wasn't working -- empty set::ssl::options would cause a crash -- compiles fine with SSL support on OpenBSD 3.5 now. -- Local opers can now join +O (operonly) channels -- Permanent modules: custom allow/except/ban/deny types were lost after /rehash -- Fixed an SVSNICK bug that could lead to duplicate users in very rare circumstances +- Win32: error msg producing garbage upon a module load error [*] +- bans were also affecting halfops in some cases (eg: changing of nick) which + was incorrect. Also +b ~n also affected voiced users, this is also fixed. +- ident in vhost { } was never sent out to other servers +- Modules: HOOKTYPE_SERVER_QUIT was called twice, could have caused crashes +- Win32: Spamfilters only added on notices might not have worked all the time +- Bans on blah@IP were not always applied +- except tkl { } did not validate the ident@ +- local TKLs (klines, zlines) were accidently distributed to other servers + if someone tried to add an already-existing TKL. +- Numeric conflict of SVSWATCH and SVSJOIN +- chanmode +mu: messages were not always properly relayed +- Resolver not working in FreeBSD jail +- Chinese/Japanese (gbk) nick code ==[ CHANGED ]== -- spamfilter.conf updates -- usage of CHG* commands are now no longer logged from U:lines -- services admins are now shown as 'Services Administrator' in /whois again. -- Changed the way MSG/NOTICE #chan works: - - It now goes to and higher, so '/notice +#chan hi!' goes to +vhoaq - - You need at least voice in order to be able to msg/notice +#chan, %#chan or @#chan - - You need at least ops in order to be able to msg/notice &#chan or ~#chan - - Any multi-prefix targets will be converted automatically (eg: ~&@#chan to @#chan) -- SVSJOIN now also supports channel keys -- Docs, help.conf and other text updates -- Added zlib+SSL+curl version check on boot to protect against crashes -- Win32: socket errors are now more clear (less 'Unknown error ' now). -- Win32: now using dynamically linked libc to get rid of some crashbugs. The dll, - msvcr70d.dll, will be downloaded automatically if needed. -- Made the 'negative TS' warning a bit more annoying since a lot of people don't - understand how critical correct time for IRC is. -- Several servernotices were turned into numerics +- allow-userhost-change force-rejoin is now also applied to opers that oper + up and receive a vhost. +- Removed * and ^ flags from /whois if PREFIX_AQ is disabled +- Using a new Makefile on *NIX so it requires less memory to compile unreal +- *NIX: 'md5' password encryption is now always available. +- Win32: 'Install as a service' is now unchecked by default +- Win32: zip/non-zip modules are now binary compatible (just like ssl/non-ssl) +- Made /whois show the usermodes to opers regardless of the eyes snomask +- Snomasks are now shown in the /whois umode output +- 005 tokens heavily updated, also modulized. +- Docs, help.conf, spamfilter.conf and other text updates +- Win32: Now using the release library msvcr70.dll [*] +- Module coders: HOOKTYPE_REMOTE_CONNECT now also gets called upon netsynch. +- Slowed down qline floods +- You can now specify multiple types in an except tkl { } block + + [*]: fix was also in the 3.2.1b win32 release ==[ ADDITIONAL INFO ]== -* See Changelog +* See Changelog for more details diff --git a/Changes b/Changes index 074b30a30..91dce4664 100644 --- a/Changes +++ b/Changes @@ -244,3 +244,170 @@ - Changed version to 3.2.1 - Moved the 3.2 changes to Changes.old ** 3.2.1 release ** +- Fixed a win32 module problem where file not found errors would display random characters, + reported by STING +- Fixed a bug where the allow-userhost-change force-rejoin setting was not applied to users + who /oper and receive an oper-host (#0001901) reported by hypnetric. +- Removed the /hs alias pointing to HelpServ for Anope since this conflicts with HostServ + (#0001709) reported by DukePyrolator +- Fixed ban bug: halfops were also prevented from doing nickchanges if banned, plus.. + +b ~n:*!*@* also made nickchanges impossible for voiced(&halfop'ed) people (so like half + of the purpose of it was defeated @$#&@#). Reported by Rocko. +- Fixed a bug where an ident in a vhost {} was never sent out to other servers and added + user@host support for set::hosts (#0001834) reported/suggested by bleepy. +- Fixed defizzer module. Reported by Rocko and netrixtardis. +- Removed the * and ^ flags from /whois if PREFIX_AQ is not enabled (requested by many people) +- Updated the /who docs to use correct English +- Added documentation for the /who and /whois flags (#0001881) reported by AngryWolf and Bugz. +- Added src/win32/win32.c for generic win32 helper functions +- Renamed src/win32/win32gui.c to src/win32/gui.c +- Reorganized much of the Windows code +- Fixed a whois bug when PREFIX_AQ is undefined, reported by Shaun +- Moved the RTF win32 code to a seperate file +- More win32 code cleanups +- Added src/win32/editor.c (woops), (#0001932) reported by Troco +- Fixed a problem with /who incorrectly showing the ? flag to opers even when the user should + be visible (#0001888) reported by Bugz and aquanight +- Added SAPART and SVSPART reasons. Note, to fully work it requires all servers to upgrade, + and due to a bug in older versions, it could cause problems if linked to 3.2 or earlier + (#0001859) suggested by Bugz +- Fixed a minor issue where Unreal registered itself as an NT service incorrectly + (#0001950) reported by rocafella +- Possibly fixed a bug that could cause Unreal to eat 100% CPU at startup on Windows. + (#0001635) reported by eggburt. Thanks to STING for helping to debug this. +- Implemented a new modules Makefile written by fez (#0001930). +- Added oper::modes to specify modes to be set for a particular oper (overrides + set::modes-on-oper), suggested by parker182 (#0001899). +- doc/example.conf now simply refers to unreal32docs.html for oper flags (#0001973) + reported by vonitsanet and AngryWolf. +- Fixed crash-on-first-connect if SSL was enabled. This seemed to happen on Mac OS X, + Sun Solaris, Opteron@Linux and perhaps others (#1982, #1984, #2110), reported by bit, + lion and liverbugg. +- Fixed a bug if me::info was set to "". +- Added a missing error message for ModuleGetErrorStr. Additionally added error checking to + ensure NULL is returned when an invalid error code is specified (#0001986) reported by + AngryWolf. +- Applied patch from slePP for bug #0001252: if IPv6 was enabled then in some cases names + were not properly resolved. Original bug reported by kormat. +- Fixed bugs regarding HOOKTYPE_SERVER_QUIT: was sometimes called twice and could cause + crashes due read-after-free. Reported by SET (#0001988). +- Fixed possible crash if /rehash'ing and a servername was just resolving (due to + /connect or autoconnect) and was not present in the cache. Reported and traced by sh0 + (#0001976). +- Fixed compile bug at *NIX caused by ModuleGetErrorStr fix. +- Improved doc/compiling_win32.txt a lot: now VC7 only, and has instructions on: + compiling modules and their (binary) compatability, zip links (zlib), ssl (OpenSSL)... + Remote includes (curl and c-ares) instructions still need to be added. +- Made 'Install as a service' unchecked by default, this should help beginners a lot. +- Updated doc/compiling_win32.txt again with curl build instructions. + Also linked to a page with an unreal dev package which contains zlib+ssl+curl + precompiled. This basically means many people no longer need to compile zlib/ssl/curl + anymore themselves (which is a pain to do and takes a lot of time). +- Windows: the 'notice' parameter in the usermsg callback was always 0 due some windows/vc + weirdness, this also affected spamfilter (so any spamfilters added only at notice + and not at msg on windows would not work). Now using the real 'notice' parameter. +- unbroke spamfilter not working for msgs/notices (oops..). +- Made zip/non-zip modules on win32 binary compatible. Since it was nowhere documented + that you should pass the ZIP_LINKS etc options to 'nmake -f makefile.win32 custommodule' + many people didn't do this which caused odd problems when reading certain clientstructs. + Module coders: in the meantime, for 3.2.1 mods, use something like: + nmake -f makefile.win32 USE_ZIPLINKS=1 ZLIB_INC_DIR="c:\dev\zlib" + ZLIB_LIB_DIR="c:\dev\zlib\dll32" custommodule MODULEFILE=m_mymodule + For 3.2.2+ these additional parameters will no longer be needed (but wouldn't harm either). +- Some doc/example.conf clarifications, mainly for modules @ win32. +- Made /whois show the user's modes to opers regardless of +e +- Added snomask to the /whois umode output +- Added a patch by rocafella to fix a crash when installing Unreal on Win2003 (#0001949). +- Moved the Command API functions to a separate file. +- Redesigned the 005 token: + - Now renamed to RPL_ISUPPORT. + - Replaced KNOCK and MAP tokens with new CMDS token (see doc/technical/005.txt) + - Implemented most tokens from the isupport draft (STATUSMSG, EXCEPTS, CHANLIMIT, + CHANNELLEN, MAXLIST). + - Removed MAXBANS. + - Made the isupport system dynamic and provide an API for modules to add tokens, may need + testing. + - Added an M_ANNOUNCE flag for CommandAdd to add the command to the CMDS token, may need + testing. +- Fixed some compile warnings. +- Fixed a bug where bans were not matched against IPs in all circumstances (#0002045) + reported by heper. +- Fixed a bug with IP based except tkl {} lines did not validate the ident portion of the mask + (#0002049) reported by Rocko. +- Fixed a problem where a local TKL could be sent to remote servers when it is being changed + (#0002048) reported by AngryWolf. +- Added documentation for link::ciphers to unreal32docs.html (#0002019) reported by Bugz. +- Updated documentation to reflect that cmode +M allows voiced users to talk, not just + registered users (#0002020) reported by crazy. +- Made it so WATCH will not respond with an erroneous reply if the parameter was simply + or - + (#0002017) reported by GouraudShading. +- SVSO now removes +v (#0002023) reported by w00t and aquanight. +- Exported the isupport functions for use in Windows modules. +- Added a new snomask, +o to show oper-up notices (oper only), (#0001965) suggested by + vonitsanet. +- Added a /userip command that works just like ircu's. +- Fixed a typo in the *nix Makefile reported by Troco (#0002059) +- Added french docs, translated by Kolibot & Babass. +- Changed some stuff to use the release version of MS libraries. +- Updated installer for msvcr70.dll +- Fixed prefix bug caused by previous 'fix'/behavior change. Reported by aquanight (#0002067). +- Updated doc/technical/token.txt and resolved 2 token conflicts. SVSWATCH is now Sw and + SVSJOIN is now BX (#0002073) reported by trystanscott. +- Fixed a bug regarding chanmode +mu where the messages were not properly relayed + to all servers. Reported by Aenox (#0002079). +- Added salted passwords. Salts are useful because it "protects" against stored-plaintext + attacks (eg: rainbow) and prevents cracking of several passwords at once. + This change means /MKPASSWD will now just generate a different string than before. + Do note however, that the old syntax/encrypted passwords will still work and _will continue + to work_ in the future, for at least the whole 3.2* series. + If you are concerned with security and have some time, then converting your passwords + is probably a good idea... Just in case your configuration file gets stolen one day ;). +- MD5 password encryption is now always available on *NIX, even if SSL is disabled. +- Temporary fix for ircsprintf %lu 1..6 issue. +- Fixed a problem with +u for some clients that have a strict interpretation of the RFC. +- Added TRE 0.7.0, fixes #0001952 reported by Praetorian +- Fixed an (unimportant) cloak typo / made it a few nanosec faster. Reported by Martin Brulisauer. +- Fixed resolver not working in FreeBSD jail, reported & patch provided by urkel (#0002097). +- Added a %n specifier to command aliases that is replaced by the user's nickname, + requested by many people. +- Added the ability for an alias {} to send to a channel (#0001686) requested by JasonTik + - As a result, alias[::format]::nick is now called alias[::format]::target to avoid + confusion. ::nick is maintained for backwards compatibility. +- Fixed a problem where IsupportAdd did not return a value. +- Module coders: Added HOOKTYPE_REMOTE_JOIN, HOOKTYPE_REMOTE_PART, HOOKTYPE_REMOTE_KICK (all + work just the same as the HOOKTYPE_LOCAL_* variants). +- Module coders: HOOKTYPE_REMOTE_CONNECT is now also called during net-merge. You can use + IsSynched(sptr->srvptr) to find out if it's called due to a net merge (0) or a connect (1). +- Added spamfiler 'user' (u) target. This regex is checked against nick!user@host:realname + when a user connects. This makes it easy to ban drones with simple patterns. + For example: '/spamfilter add u gzline 86400 Drone[0-9]+!.+@.+:Drone[0-9]' + would kill any drones that have both a nick and realname with 'Drone' followed by digits. +- If a nick is qlined, the user is now lagged up to limit qline floods a bit (#0001335). +- Made docs a bit more clear on spamfilter targettypes. +- Fix for too broad regex in badword::word causing the IRCd to hang, reported by Flop + (#0002101). +- IPv6: Fixed hostnames in link::hostname not working, reported by Jasmin (#0001990). +- Fixed OOB read/write on user quit (did no harm on Linux&FreeBSD). +- Fixed some tiny memory leaks (~100 bytes) on rehash. +- Updated chinese&japanese GBK nick code, fix supplied by Xuefer (#0002051). +- Added release notes (unfinished). +- Added file: include/macros.h and a new macro, ARRAY_SIZEOF. +- Added the ability to specify multiple types in a tkl except, suggested by Bugz (#0002085). +- Added spamfilter 'away' ('a') target (#0002057). +- Fixed a qline duplicate msg bug I think +- Windows version can now hold ~4096 connections instead of ~1024 +- help.conf: clarified MKPASSWD documentation, reported by hypnetric (#0001926). +- Some modeskip handling for future versions +- Fixed serious heap corruption bug if remote users were using qlined nicks, thanks to + Gilou and Trankill for making me able to trace this issue down (#0002032). +- Fixed qline notices again: now gives msg #1 for local qlined-nick attempts, and + another msg in case of a remote client (eg: oper) using a qlined nick. +- Added some future SJOIN skip stuff. +- Updated version to 3.2.2-pre1 already. +** internal 3.2.2-pre1 release ** +- Fixed some doc & release notes typos. Reported by Rocko, HiT. +- French doc updates, hopefully synched now. +- (revert of badsyntax fix) +- Forgot to mention away spamfilter target in helpop, reported by Rocko. +- Changed version to 3.2.2 +** 3.2.2 release ** diff --git a/Unreal.nfo b/Unreal.nfo index 101e7061e..9b05da382 100644 --- a/Unreal.nfo +++ b/Unreal.nfo @@ -1,5 +1,5 @@ =============================================== -= UnrealIRCd v3.2.1 = += UnrealIRCd v3.2.2 = =============================================== Was brought to you by: diff --git a/aliases/aliases.conf b/aliases/aliases.conf index c8e264bc9..8761a9ac0 100644 --- a/aliases/aliases.conf +++ b/aliases/aliases.conf @@ -2,12 +2,12 @@ alias identify { format "^#" { - nick chanserv; + target chanserv; type services; parameters "IDENTIFY %1-"; }; format "^[^#]" { - nick nickserv; + target nickserv; type services; parameters "IDENTIFY %1-"; }; @@ -16,12 +16,12 @@ alias identify { alias services { format "^#" { - nick chanserv; + target chanserv; type services; parameters "%1-"; }; format "^[^#]" { - nick nickserv; + target nickserv; type services; parameters "%1-"; }; @@ -30,12 +30,12 @@ alias services { alias register { format "^#" { - nick chanserv; + target chanserv; type services; parameters "REGISTER %1-"; }; format "^[^#]" { - nick nickserv; + target nickserv; type services; parameters "REGISTER %1-"; }; diff --git a/aliases/anope.conf b/aliases/anope.conf index f06dba83e..7c2de6aa2 100644 --- a/aliases/anope.conf +++ b/aliases/anope.conf @@ -1,19 +1,18 @@ /* Anope Aliases */ alias nickserv { type services; }; -alias ns { nick nickserv; type services; }; +alias ns { target nickserv; type services; }; alias chanserv { type services; }; -alias cs { nick chanserv; type services; }; +alias cs { target chanserv; type services; }; alias memoserv { type services; }; -alias ms { nick memoserv; type services; }; +alias ms { target memoserv; type services; }; alias operserv { type services; }; -alias os { nick operserv; type services; }; +alias os { target operserv; type services; }; alias helpserv { type services; }; -alias hs { nick helpserv; type services; }; alias botserv { type services; }; -alias bs { nick botserv; type services; }; +alias bs { target botserv; type services; }; alias hostserv { type services; }; -alias hs { nick hostserv; type services; }; +alias hs { target hostserv; type services; }; include "aliases/aliases.conf"; diff --git a/aliases/auspice.conf b/aliases/auspice.conf index 22ed1483f..0646b8912 100644 --- a/aliases/auspice.conf +++ b/aliases/auspice.conf @@ -1,16 +1,16 @@ /* Auspice Aliases */ alias nickserv { type services; }; -alias ns { nick nickserv; type services; }; +alias ns { target nickserv; type services; }; alias chanserv { type services; }; -alias cs { nick chanserv; type services; }; +alias cs { target chanserv; type services; }; alias memoserv { type services; }; -alias ms { nick memoserv; type services; }; +alias ms { target memoserv; type services; }; alias helpserv { type services; }; -alias hs { nick helpserv; type services; }; +alias hs { target helpserv; type services; }; alias operserv { type services; }; -alias os { nick operserv; type services; }; +alias os { target operserv; type services; }; alias rootserv { type services; }; -alias rs { nick rootserv; type services; }; +alias rs { target rootserv; type services; }; include "aliases/aliases.conf"; diff --git a/aliases/cygnus.conf b/aliases/cygnus.conf index ed869402c..7a954da2a 100644 --- a/aliases/cygnus.conf +++ b/aliases/cygnus.conf @@ -1,12 +1,12 @@ /* Cygnus Aliases */ alias nickserv { type services; }; -alias ns { nick nickserv; type services; }; +alias ns { target nickserv; type services; }; alias chanserv { type services; }; -alias cs { nick chanserv; type services; }; +alias cs { target chanserv; type services; }; alias memoserv { type services; }; -alias ms { nick memoserv; type services; }; +alias ms { target memoserv; type services; }; alias rootserv { type services; }; -alias rs { nick rootserv; type services; }; +alias rs { target rootserv; type services; }; include "aliases/aliases.conf"; diff --git a/aliases/epona.conf b/aliases/epona.conf index a5aaaae3c..0ffd5c6ed 100644 --- a/aliases/epona.conf +++ b/aliases/epona.conf @@ -1,16 +1,16 @@ /* Epona Aliases */ alias nickserv { type services; }; -alias ns { nick nickserv; type services; }; +alias ns { target nickserv; type services; }; alias chanserv { type services; }; -alias cs { nick chanserv; type services; }; +alias cs { target chanserv; type services; }; alias memoserv { type services; }; -alias ms { nick memoserv; type services; }; +alias ms { target memoserv; type services; }; alias operserv { type services; }; -alias os { nick operserv; type services; }; +alias os { target operserv; type services; }; alias helpserv { type services; }; -alias hs { nick helpserv; type services; }; +alias hs { target helpserv; type services; }; alias botserv { type services; }; -alias bs { nick botserv; type services; }; +alias bs { target botserv; type services; }; include "aliases/aliases.conf"; diff --git a/aliases/generic.conf b/aliases/generic.conf index b50f75b8a..f063939fa 100644 --- a/aliases/generic.conf +++ b/aliases/generic.conf @@ -1,14 +1,14 @@ /* Generic Aliases */ alias nickserv { type services; }; -alias ns { nick nickserv; type services; }; +alias ns { target nickserv; type services; }; alias chanserv { type services; }; -alias cs { nick chanserv; type services; }; +alias cs { target chanserv; type services; }; alias memoserv { type services; }; -alias ms { nick memoserv; type services; }; +alias ms { target memoserv; type services; }; alias operserv { type services; }; -alias os { nick operserv; type services; }; +alias os { target operserv; type services; }; alias helpserv { type services; }; -alias hs { nick helpserv; type services; }; +alias hs { target helpserv; type services; }; include "aliases/aliases.conf"; diff --git a/aliases/genericstats.conf b/aliases/genericstats.conf index 9e6f7ede7..fe45390d8 100644 --- a/aliases/genericstats.conf +++ b/aliases/genericstats.conf @@ -1,4 +1,4 @@ /* Generic StatServ Aliases */ alias statserv { type stats; }; -alias ss { nick statserv; type stats; }; +alias ss { target statserv; type stats; }; diff --git a/aliases/ircservices.conf b/aliases/ircservices.conf index 724a8f096..2608312fe 100644 --- a/aliases/ircservices.conf +++ b/aliases/ircservices.conf @@ -1,17 +1,17 @@ /* IRCServices Aliases */ alias nickserv { type services; }; -alias ns { nick nickserv; type services; }; +alias ns { target nickserv; type services; }; alias chanserv { type services; }; -alias cs { nick chanserv; type services; }; +alias cs { target chanserv; type services; }; alias memoserv { type services; }; -alias ms { nick memoserv; type services; }; +alias ms { target memoserv; type services; }; alias operserv { type services; }; -alias os { nick operserv; type services; }; +alias os { target operserv; type services; }; alias helpserv { type services; }; -alias hs { nick helpserv; type services; }; +alias hs { target helpserv; type services; }; alias irciihelp { type services; }; alias statserv { type services; }; -alias ss { nick statserv; type services; }; +alias ss { target statserv; type services; }; include "aliases/aliases.conf"; diff --git a/aliases/operstats.conf b/aliases/operstats.conf index 109db0792..a10b55f7f 100644 --- a/aliases/operstats.conf +++ b/aliases/operstats.conf @@ -1,6 +1,6 @@ /* OperStats Aliases */ alias operserv { type stats; }; -alias os { nick operserv; type stats; }; +alias os { target operserv; type stats; }; alias statserv { type stats; }; -alias ss { nick statserv; type stats; }; +alias ss { target statserv; type stats; }; diff --git a/autoconf/configure.in b/autoconf/configure.in index 091ea4138..79f85c0e8 100644 --- a/autoconf/configure.in +++ b/autoconf/configure.in @@ -372,7 +372,7 @@ IRCDLIBS="$IRCDLIBS -lresolv " esac dnl REMEMBER TO CHANGE WITH A NEW RELEASE! -tre_version="0.6.8" +tre_version="0.7.0" AC_MSG_RESULT(extracting TRE regex library) cur_dir=`pwd` cd extras diff --git a/configure b/configure index 14ebf9e32..090295e01 100755 --- a/configure +++ b/configure @@ -10184,7 +10184,7 @@ IRCDLIBS="$IRCDLIBS -lresolv " ;; esac -tre_version="0.6.8" +tre_version="0.7.0" echo "$as_me:$LINENO: result: extracting TRE regex library" >&5 echo "${ECHO_T}extracting TRE regex library" >&6 cur_dir=`pwd` diff --git a/doc/compiling_win32.txt b/doc/compiling_win32.txt index 927bf83e8..51cea8167 100644 --- a/doc/compiling_win32.txt +++ b/doc/compiling_win32.txt @@ -1,30 +1,20 @@ ==[ IMPORTANT MESSAGE ABOUT DISABLING NOSPOOF ]== Disabling NOSPOOF at windows (w9x, nt, w2k, xp) is NOT recommended since this -will allow users to use "spoofed hosts" (like the IP of someone you trust). +WILL allow users to use "spoofed hosts" (like the IP of someone you trust). If you got problems with NOSPOOF fix your client (bot?) instead (you should PONG back to the initial PING at connect). -==[ HOW TO COMPILE UNREALIRCD WITHOUT SSL AT WINDOWS ]== +==[ GENERAL GUIDELINES ]== First of all you need Microsoft Visual C++, compiling with cygwin is not supported. -== "old" VC++ 6.0 == -1. You need the Platform SDK (PSDK) - Grab it at: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ -> - core sdk -> install this sdk. - Note that this can take some time to download because it's >200Mb - (450mb installed) [!]. -2. To compile: - start -> programs -> platform sdk blabla -> open build env. -> (choose os) -> - set blabla build env (debug). This will launch a DOS window. -3. Go to your UnrealIrcd dir (like: cd \dev\unreal3.2) and then compile with: - nmake -f makefile.win32 - This will generate a wircd.exe and unreal.exe -4. Copy the src\win32\tre.dll to your UnrealIrcd main dir. -5. Done! +VC++ 7.x (.NET) is highly recommended. VC 6 might work but it requires +the Platform SDK (PSDK), it also has quite some bugs (there are 5 servicepacks!). +Basically VC7 is just much easier and known to work, therefore we'll assume +in this text that you are using it. -== VC++ 7.x (.NET) == +== Simple compile (no SSL/ZIP/Remote includes) == 1. Start the Visual Studio .NET Command Prompt 2. Go to your UnrealIrcd dir (like: cd \dev\unreal3.2) and then compile with: nmake -f makefile.win32 @@ -32,12 +22,132 @@ is not supported. 3. Copy the src\win32\tre.dll to your UnrealIrcd main dir. 4. Done! -==[ HOW TO COMPILE UNREALIRCD WITH SSL AT WINDOWS ]== -Ouch, that's much work ;). -You need to compile openssl yourself. -Then have a look at makefile.win32 for instruction on how -to enable / specify path / etc... -DO NOT ask us for help with compiling openssl! +== Compiling modules == +1. Put your module (the .c file) in src\modules (eg: c:\dev\unreal3.2\src\modules). +2. Start the Visual Studio .NET Command Prompt +3. Go to your UnrealIrcd dir (like: cd \dev\unreal3.2). +4. Compile the module with: + nmake -f makefile.win32 custommodule MODULEFILE= + is the name of the module WITHOUT the .c suffix, so if your + module has the filename 'm_crappymod.c', then you use: + nmake -f makefile.win32 custommodule MODULEFILE=m_crappymod +5. Done. A .dll file should have been created. -==[ AND ZIP LINKS SUPPORT? ]== -See makefile.win32 for instructions. +If you compiled with VC7 and used the official source (not a CVS version, +but for example 3.2.1 source) then the module should work on all these +versions (binary compatible) and you could for example put them on +your website so users can download them. +Such a module will work on both SSL and non-SSL, there should be no need +for separate versions... unless, of course, you use SSL-specific code in your mod. +DO NOT download a CVS version & compile your mod and then start +distributing the .dll for use at another (non-CVS) version!! +Every time we change a struct (and in some other cases) it makes the +binary/module binary incompatible which practically means your module +will CRASH or cause memory corruption and other subtle errors. + +== COMPILING WITH ZIP LINKS / SSL / REMOTE INCLUDES SUPPORT == +First of all, DO NOT use any precompiled libs from the official +zlib/openssl/curl sites. We require certain compile parameters. +Versions downloaded from such sites will often CRASH. + +The easiest is to download the UnrealIRCd development package +which contains zlib, openssl and curl precompiled for you. +See: www.vulnscan.org/unrealwin32dev/ + +Just extract it somewhere (eg: to c:\dev). +Then, use compile flags to enable the features + specify where to look. +Here are examples if you used c:\dev: +ZIP: nmake -f makefile.win32 USE_ZIPLINKS=1 ZLIB_INC_DIR="c:\dev\zlib" ZLIB_LIB_DIR="c:\dev\zlib\dll32" +SSL: nmake -f makefile.win32 USE_SSL=1 OPENSSL_INC_DIR="c:\dev\openssl\include" OPENSSL_LIB_DIR="c:\dev\openssl\lib" +CURL: nmake -f makefile.win32 USE_REMOTEINC=1 LIBCURL_INC_DIR="c:\dev\curl\include" LIBCURL_LIB_DIR="c:\dev\curl\lib" + +Obviously you can (and probably will) combine all these options, like +to build a zip+ssl+curl version (all in 1 line): +nmake -f makefile.win32 USE_ZIPLINKS=1 ZLIB_INC_DIR="c:\dev\zlib" ZLIB_LIB_DIR="c:\dev\zlib\dll32" +USE_SSL=1 OPENSSL_INC_DIR="c:\dev\openssl\include" OPENSSL_LIB_DIR="c:\dev\openssl\lib" USE_REMOTEINC=1 +LIBCURL_INC_DIR="c:\dev\curl\include" LIBCURL_LIB_DIR="c:\dev\curl\lib" + +== COMPILING ZLIB/SSL/CURL YOURSELF == +This is quite some work.. With the precomiled method shown above it +just takes like 5-10 minutes to have a zlib+ssl+curl Unreal version. +But if you want to compile each of these libs manually then it will +probably take an hour or so. + +** THE INFORMATION BELOW IS OUTDATED, WE GOT RID OF MDd, USE MD INSTEAD + AND DONT COMPILE OPENSSL W/DEBUG *** + +== ZIP LINKS (zlib) == +[NOTE: precompiled dlls should NOT be used because they will cause a crash + (this is due to different compile parameters / api call systems] +To compile with ziplinks support you need to do the following: +Download the SOURCE from http://www.winimage.com/zLibDll/ +(at the time of writing, http://www.winimage.com/zLibDll/zlib121.zip) +and extract it to somewhere, for example c:\dev\zlib-1.2.1 + +Then, edit win32\makefile.msc: +- Change -MD to -MDd +- Add -D ZLIB_WINAPI to CFLAGS +- so the result will be like: + CFLAGS = -nologo -MDd -O2 $(LOC) -D ZLIB_WINAPI +- Then compile: nmake -f win32\Makefile.msc +- Assuming the above step went fine, your zlib is now ready. +- Now, to compile UnrealIRCd with ziplinks you do something like this: + nmake -f makefile.win32 USE_ZIPLINKS=1 ZLIB_INC_DIR="c:\dev\zlib-1.2.1" ZLIB_LIB_DIR="c:\dev\zlib-1.2.1" + Obviously, change the paths if needed [1st = *.h files, 2nd=*.dll/*.lib] + +== SSL (OpenSSL) == +[note: openssl requires perl to configure/compile!] +- Download latest openssl (eg: openssl-0.9.7d.tar.gz) and extract it somewhere + (we'll use c:\dev\openssl-0.9.7d in this example) +- Open util\do_masm.bat, add 'debug' to the lines with 'mk1mf.pl' BUT be careful + since it should NOT be the last word, so add it somewhere before that. + For example: perl util\mk1mf.pl dll debug VC-W31-32 >ms\w31dll.mak +- Start the +- Now we go build openssl, run: + ms\do_masm + nmake -f ms\ntdll.mak +- Assuming the above step went fine, your OpenSSL is now ready. +- Now, to compile UnrealIRCd with ziplinks you do something like this: + nmake -f makefile.win32 USE_SSL=1 OPENSSL_INC_DIR="c:\openssl\inc32\openssl" OPENSSL_LIB_DIR="C:\Dev\openssl\out32dll.dbg" + Obviously, change the paths if needed [1st=*.h files, 2nd=*.dll/*.lib] + +== REMOTE INCLUDES (curl, c-ares) == +- Download latest c-ares source from http://daniel.haxx.se/projects/c-ares/ + Download latest curl source from http://curl.haxx.se/download.html + Extract both somewhere (eg: c:\dev\c-ares-1.2.0 and c:\dev\curl-7.12.0) +- Open vc\vc.dsw from your ares directory. Assuming you have VC7 it will ask + whether it should convert the project, choose 'Yes to all'. +- (solution explorer) areslib -> properties + C/C++ -> code generation -> runtime library: Change to + 'Multi-threaded Debug DLL (/MDd)' +- at the time of writing 'ares_free_errmem.c' should be removed from the + project file (solution explorer -> source files -> find the file + press + delete). Also 'ares_version.c' and 'ares_cancel.c' should be added + (solution explorer -> source files -> rightclick -> add -> add existing -> + go down a few directories if needed and choose the file). +- right click at 'areslib' in the solution explorer and select 'Build'. + Assuming it compiled fine, we are done with c-ares. +- Now go to the curl directory and open lib\curllib.dsw. Choose 'Yes to all' + again when asked about converting. +- Open config-win32.h (@header files in solution explorer) and add: + #define USE_ARES 1 +- Open include\curl\multi.h and change the line with: + #include + to: + #include +- (solution explorer) curllib -> properties + - C/C++ -> code generation -> runtime library: Change to + 'Multi-threaded Debug DLL (/MDd)' + - C/C++ -> general -> additional include directories: + add the path to your (eg: C:\Dev\c-ares-1.2.0). + - linker -> general -> additional library directories: + add the path to your \vc\areslib\Debug, + for example C:\Dev\c-ares-1.2.0\vc\areslib\Debug. + - linker -> input -> additional dependencies: + add: areslib.lib + - linker -> input -> Module defenition file: + set to: libcurl.def + Done with editting properties. +- Now: Build -> rebuild solution, everything should compile fine. +- Now, to compile UnrealIRCd with remote includes you do something like this: + nmake -f makefile.win32 USE_REMOTEINC=1 LIBCURL_INC_DIR="C:\Dev\curl-7.12.0\include" LIBCURL_LIB_DIR="C:\Dev\curl-7.12.0\lib\Debug" diff --git a/doc/example.conf b/doc/example.conf index 4c30d3ce0..badf1bae2 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -26,12 +26,17 @@ #those lines are ignored by the ircd. /* - * At *NIX UnrealIrcd supports modules. - * Loading the commands module and a cloaking module is required: + * UnrealIRCd supports modules, loading some of them is required. + * You need at least the commands module and a cloaking module. */ -loadmodule "src/modules/commands.so"; -loadmodule "src/modules/cloak.so"; +/* FOR *NIX, uncomment the following 2lines: */ +//loadmodule "src/modules/commands.so"; +//loadmodule "src/modules/cloak.so"; + +/* FOR Windows, uncomment the following 2 lines: */ +//loadmodule "modules/commands.dll"; +//loadmodule "modules/cloak.dll"; /* * You can also include other configuration files. @@ -182,39 +187,10 @@ allow channel { * }; */ -/* OLD OPER FLAG | NEW FLAG NAME - O global - o local - a services-admin - A admin - r can_rehash - D can_die - R can_restart - h helpop - w can_wallops - g can_globops - c can_localroute - L can_globalroute - k can_localkill - K can_globalkill - b can_kline - Z can_gzline - t can_gkline - B can_unkline - n can_localnotice - G can_globalnotice - N netadmin - C coadmin - z can_zline - W get_umodew - H get_host - v can_override -*/ -/* -Note: netadmin gives you OaAN -admin and services-admin give you o as well -*/ +/* For a list of oper flags, see doc/unreal32docs.html#operblock + * [HIGHLY recommended to read] + */ oper bobsmith { class clients; @@ -225,9 +201,13 @@ oper bobsmith { flags { netadmin; + can_zline; + can_gzline; + can_gkline; global; }; }; + /* * NEW: listen {} * OLD: P:Line @@ -279,6 +259,14 @@ listen *:6697 listen *:8067; listen *:6667; +/* NOTE: If you are on an IRCd shell with multiple IP's you are + * likely to get 'Address already in use' errors in your log + * and the ircd won't start. This means you MUST bind + * to a specific IP instead of '*', so for example: + * listen 1.2.3.4:6667; + * Obviously, replace the IP with the IP that was assigned to you. + */ + /* * NEW: link {} * OLD: C/N:Lines @@ -329,9 +317,7 @@ link hub.mynet.com password-receive "LiNk"; class servers; options { - /* Note: You should not use autoconnect when linking - * services - */ + /* Note: You should not use autoconnect when linking services */ autoconnect; ssl; zip; @@ -414,7 +400,7 @@ log "ircd.log" { * * Syntax: * alias "name" { - * nick "points to"; + * target "points to"; * type aliastype; * }; * @@ -423,7 +409,7 @@ log "ircd.log" { // This points the command /nickserv to the user NickServ who is connected to the set::services-server server /*alias NickServ { - nick "NickServ"; + target "NickServ"; type services; };*/ @@ -452,7 +438,7 @@ alias StatServ { type stats; }; * Syntax: * alias "name" { * format "format string" { - * nick "points to"; + * target "points to"; * type aliastype; * parameters "parameters to send"; * }; @@ -465,12 +451,12 @@ alias StatServ { type stats; }; /* alias "identify" { format "^#" { - nick "chanserv"; + target "chanserv"; type services; parameters "IDENTIFY %1-"; }; format "^[^#]" { - nick "nickserv"; + target "nickserv"; type services; parameters "IDENTIFY %1-"; }; @@ -485,18 +471,19 @@ alias "identify" { /* The alias::format::parameters is similar to scripting languages. %N (where N is a number) represents a * parameter sent to the command (in this case /identify). If you specify %N- it means all parameters from - * N until the last parameter in the string. + * N until the last parameter in the string. You may also specify %n which is replaced by + * the user's nickname. */ /* Standard aliases */ alias "services" { format "^#" { - nick "chanserv"; + target "chanserv"; type services; parameters "%1-"; }; format "^[^#]" { - nick "nickserv"; + target "nickserv"; type services; parameters "%1-"; }; @@ -505,12 +492,12 @@ alias "services" { alias "identify" { format "^#" { - nick "chanserv"; + target "chanserv"; type services; parameters "IDENTIFY %1-"; }; format "^[^#]" { - nick "nickserv"; + target "nickserv"; type services; parameters "IDENTIFY %1-"; }; @@ -537,6 +524,11 @@ tld { rules "ircd.rules.fr"; }; +/* note: you can just delete the example block above, + * in which case the defaults motd/rules files (ircd.motd, ircd.rules) + * will be used for everyone. + */ + /* * NEW: ban nick {} * OLD: Q:Line diff --git a/doc/technical/005.txt b/doc/technical/005.txt index abb45950e..7a82eb992 100644 --- a/doc/technical/005.txt +++ b/doc/technical/005.txt @@ -1,5 +1,5 @@ -Numeric 005 Documentation (c) 2002 codemastr (Dominick Meglio) [codemastr@unrealircd.com] -(As of Unreal3.2-beta11) +Numeric 005 Documentation (c) 2002-2004 codemastr (Dominick Meglio) [codemastr@unrealircd.com] +(As of Unreal3.2.1) Numeric 005 allows the server to inform the client of any protocol specific features in the IRCd. The numeric is sent at connection time immediately after numeric 004. Additionally @@ -17,13 +17,23 @@ by this server" Currently UnrealIRCd supports several tokens that are included in numeric 005. A list of all tokens, their respective value and a brief description are listed below. +Unreal attempts to follow the proposed ISupport standard as much as possible. Unreal only +ignores the standard in one regard, the TARGMAX token. This token is believed to be +impractical and technically impossible to correctly implement due to existing limitations +in the standard. Therefore, this token is not currently supported. + +Unreal does additionally provide a few tokens which are not specified in the standard, these +include: HCN, AWAYLEN, WATCH, SILENCE, EXTBAN, ELIST, and CMDS. Unreal also maintains a few +legacy tokens such as MAXCHANNELS and WALLCHOPS to ensure compatibility until the ISupport +standard is more widely accepted by clients. + Token Value Default Value Description ------------------------------------------------------------------------------------------------ MAP none none Informs the client that the /map - command is present. + command is present. [Obsolete] KNOCK none none Informs the client that the /knock - command is present. + command is present. [Obsolete] SAFELIST none none The LIST command is sent in multiple iterations so that the @@ -34,10 +44,11 @@ HCN none none The server supports t (Hybrid Connect Notice) protocol. MAXCHANNELS number 10 The maximum number of channels a - user may join. + user may join. [Deprecated] MAXBANS number 60 The maximum number of bans that may be placed for a channel. + [Obsolete] NICKLEN number 30 Maximum length of a user's nickname. @@ -55,6 +66,7 @@ AWAYLEN number 307 Maximum length of an WALLCHOPS none none Indicates that you may use NOTICE/PRIVMSG to send to +ohv by using PRIVMSG/NOTICE [@|%|+]#channel. + [Deprecated] WATCH number 128 Indicates the presence of the WATCH command and specifies the @@ -106,8 +118,39 @@ ELIST flags MNUCT Specifies the set of indicates mask based searching, the N flag indicates negative mask based searching. The U flag - meaning support for user count + means support for user count searching. The C flag allows channel creation time searching, and the T flag allows topic set time searching. + +CMDS commands MAP,KNOCK,DCCALLOW,USERIP Specifies a series of commands that + can be useful for the client to know + exist as they may provide a more + efficient means for the client to + accomplish a specific task. This + token replaces the MAP and KNOCK + tokens. + +STATUSMSG flags ~&@%+ Specifies the mode flags that may + prefix a channel name in a PRIVMSG + or NOTICE to limit who receives the + message to only those with a certain + level of access. This token will + replace the WALLCHOPS token. + +EXCEPTS none none Indicates that channel ban exceptions + (+e) are supported by the server. + +MAXLIST mode:num,... b:60,e:60 Specifies the maximum number of + entries that may be added to a + particular mode list (type A modes). + This token replaces MAXBANS. + +CHANLIMIT pfx:num,... #:10 Specifies the maximum number of + channels with the specified prefix + that a user may join at one time. + This token will replace MAXCHANNELS. + +CHANNELLEN number 32 Provides the maximum length of a + channel name that a user can create. diff --git a/doc/technical/token.txt b/doc/technical/token.txt index 60db3565d..4ff8c5d08 100644 --- a/doc/technical/token.txt +++ b/doc/technical/token.txt @@ -1,85 +1,8 @@ -Token List (c) 2002 codemastr (Dominick Meglio) [codemastr@unrealircd.com] -(As of Unreal3.2-beta11) +Token List (c) 2002-2004 codemastr (Dominick Meglio) [codemastr@unrealircd.com] +(As of Unreal3.2.2) Command Token ------------------------------------------------------------------------------------------------ -PRIVMSG ! -WHO \ -WHOIS # -WHOWAS $ -USER % -NICK & -SERVER ' -LIST ( -TOPIC ) -INVITE * -VERSION + -QUIT , -SQUIT - -KILL . -INFO / -LINKS 0 -SUMMON 1 -STATS 2 -USERS 3 -HELP 4 -HELPOP 4 -ERROR 5 -AWAY 6 -CONNECT 7 -PING 8 -PONG 9 -OPER ; -PASS < -WALLOPS = -TIME > -NAMES ? -ADMIN @ -NOTICE B -JOIN C -PART D -LUSERS E -MOTD F -MODE G -KICK H -USERHOST J -ISON K -REHASH O -RESTART P -CLOSE Q -DIE R -HASH S -DNS T -SILENCE U -AKILL V -KLINE W -UNKLINE X -RAKILL Y -GNOTICE Z -GOPER [ -GLOBOPS ] -LOCOPS ^ -PROTOCTL _ -WATCH ` -TRACE b -SQLINE c -UNSQLINE d -SVSNICK e -SVSNOOP f -SVSKILL h -SVSMODE n -SAMODE o -CHATOPS p -ZLINE q -UNZLINE r -RULES t -MAP u -SVS2MODE v -DALINFO w -ADCHAT x -MKPASSWD y -ADDLINE z -GLINE } SETHOST AA NACHAT AC SETIDENT AD @@ -94,15 +17,16 @@ RPING AM RPONG AN NETINFO AO SENDUMODE AP -ADDMODE AQ -ADDOMODE AR -SVSMODE AS +ADDMOTD AQ +ADDOMOTD AR +SVSMOTD AS SMO AU OPERMOTD AV TSCTL AW SAJOIN AX SAPART AY CHGIDENT AZ +NOTICE B SWHOIS BA SVSO BB SVSFLINE BC @@ -110,13 +34,62 @@ TKL BD VHOST BE BOTMOTD BF HTM BH +DCCDENY BI +UNDCCDENY BJ +CHGNAME BK SHUN BL -SVSJOIN BR +CYCLE BP +MODULE BQ +SVSNLINE BR SVSPART BT -SJOIN ~ +SVSLUSERS BU +SVSSNO BV +SVS2SNO BW +SVSJOIN BX +SVSSILENCE Bs +SVSWATCH Bw +JOIN C +NEWJOIN C +PART D +LUSERS E +EOS ES +MOTD F +MODE G +KICK H +USERHOST J +ISON K +REHASH O +RESTART P +CLOSE Q +DIE R +SENDSNO Ss +DNS T +TEMPSHUN Tz +SILENCE U +AKILL V +UNKLINE X +RAKILL Y +GLOBOPS ] +LOCOPS ^ +PROTOCTL _ +WATCH ` +TRACE b +SQLINE c +UNSQLINE d +SVSNICK e +SVSNOOP f +SVSKILL h +SVSMODE n +SAMODE o +CHATOPS p +UNZLINE r +RULES t +MAP u +SVS2MODE v +DALINFO w +ADCHAT x +MKPASSWD y +ADDLINE z UMODE2 | - - - - - +GLINE } +SJOIN ~ diff --git a/doc/technical/vl.txt b/doc/technical/vl.txt index 1793bd5f5..13c3b8d48 100644 --- a/doc/technical/vl.txt +++ b/doc/technical/vl.txt @@ -3,6 +3,7 @@ VL Information (c) 2002 codemastr (Dominick Meglio) [codemastr@unrealircd.com] Protocol Version ------------------------------------------------------------------------------------------------ +2305 3.2.2 2304 3.2.1 2303 3.2-beta*, 3.2-RC*, 3.2 2302 3.1.1-Darkshades, 3.1.2-Darkshades, 3.1.3-Komara, 3.1.4-Meadows diff --git a/doc/translations.txt b/doc/translations.txt index 984f39dda..b246f6a11 100644 --- a/doc/translations.txt +++ b/doc/translations.txt @@ -10,6 +10,9 @@ There a few requirements however: unreal32docs.html (www.vulnscan.org/UnrealIrcd/unreal32docs.html). - Of course the translation should be correct.. So also 'technically', it's therefore recommended that have some real experience with Unreal ;) +- If you are accepted and start working on it, it would be nice if you + could put your docs-in-progress online somewhere so we can see how + progress is going a bit. - Someone (usually the person who translated it) needs to be willing to actively maintain the docs. This is very important! If docs are out of date (out-of-synch) there will be confusion among users. diff --git a/doc/unreal32docs.de.html b/doc/unreal32docs.de.html index 5ea956ffe..1014b283c 100644 --- a/doc/unreal32docs.de.html +++ b/doc/unreal32docs.de.html @@ -19,13 +19,15 @@ English | German | Spanish | -Hungarian

+Hungarian | +French +

UnrealIRCd
http://www.unrealircd.com
- Version: 3.2.1
- Aktuelle Version: 3.2.1
- Letztes Dokumentation Update: 2004-07-03
+ Version: 3.2.2
+ Aktuelle Version: 3.2.2
+ Letztes Dokumentation Update: 2004-10-11 Head Coders: Stskeeps / codemastr / Syzop / Luke
Contributors: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
Dokumentation: CKnight^ / Syzop
@@ -208,8 +210,8 @@ Bug gemeldet wird!

senden.

Installationsanleitungen
Linux:

    -
  1. gunzip -d Unreal3.2.tar.gz -
  2. tar xvf Unreal3.2.tar +
  3. gunzip -d Unreal3.2.2.tar.gz +
  4. tar xvf Unreal3.2.2.tar
  5. cd Unreal3.2
  6. ./Config
  7. Die hierbei angezeigten Fragen nach bestem Wissen beantworten. Allgemein ist @@ -306,6 +308,7 @@ N - globale nick Nicks
    s - Server Nachrichten anzeigen [*]
    S - Spamfilter Nachrichten anzeigen
    +o - Oper-up Meldungen 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) @@ -734,87 +737,152 @@ Ebenso k 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 werden durch den  /spamfilter Befehl mit der folgenden Syntax +gesetzt:
    /spamfilter [add|del|remove|+|-] [type] [action] [tkltime] [reason] [regex]
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + - - + + geleitet. - - -
    [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 gibt an, auf welchen Nachrichtentyp reagiert + werden soll;
    Zeichen:Config EintragBedeutung
    cchannelNachricht im Channel (öffentlich)
    pprivatPrivate Nachricht (von User --> User)
    nprivate-noticePrivate Notiz
    Nchannel-noticeChannel Notiz
    PpartGrund Angabe beim Verlassen des Channels
    qquitGrund Angabe beim Beenden des Chats
    ddccDCC Dateiname
    uuserbannt User, geprüft wird auf nick!user@host:realname
    Es ist möglich, mehrere Ziele anzugeben, wie + z.B.: cpNn
    [action][action] gibt an, welche Aktion erfolgen soll (es kann nur 1 Aktion + 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 + 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 HostshunSetzt einen Shun auf den Host
    klineSetzt eine kline auf den HostklineSetzt eine kline auf den Host
    glineSetzt eine gline auf den HostglineSetzt eine gline auf den Host
    zlineSetzt eine zline auf den HostzlineSetzt eine zline auf den Host
    gzlineSetzt eine gzline (globale zline) auf den HostgzlineSetzt eine gzline (globale zline) auf den Host
    blockBlockiert lediglich die NachrichtblockBlockiert lediglich die Nachricht
    dccblockmarkiert den User derart, dass er nicht in der Lage ist, + 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 + 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 + 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 + 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 @@ -822,7 +890,7 @@ angegeben werden)
    [regex] gibt den Ausdruck oder das 'bad word' an, welches geblockt werden +  gibt den Ausdruck oder das 'bad word' an, welches geblockt werden soll, oder worauf die Aktion erfolgen soll
    @@ -854,6 +922,15 @@ g Die Syntax dieser spamfilter { } Blöcke wird hier erklärt:

    +Beispiel: +

    spamfilter {
    + regex "//write \$decode\(.+\|.+load -rs";
    + target { private; channel; };
    + reason "Generic $decode exploit";
    + action block;
    +};
    +

    +
    set::spamfilter::ban-time ermöglicht die Festlegung einer Default Bann Dauer für *lines die durch den Spamfilter gesetzt wurden (default: 1 Tag)
    @@ -1203,6 +1280,7 @@ bekannt als O:Line)

    }; swhois <whois info>; snomask <snomask>; + modes <modes>; maxlogins <num>; };

    Mit dem Oper Block können für den Server IRC Operatoren festgelegt werden. 
    @@ -1514,9 +1592,12 @@ Form (wie z.B.: "services-admin") verwenden m 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  +voreingestellt sind. Siehe Abschnitt 3.3  für Infos über snomasks. [optional] +

    Mit der oper::modes Anweisung können Modi für Opers voreingestellt +werden, so dass man beim oper Befehl bestimmte Flags automatisch +voreingestellt sind. [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 @@ -1792,7 +1873,7 @@ setzen, bislang ist hier aber nur  tld::options::ssl m

    TLD Einträge werden von unten nach oben abgearbeitet.

    Beispiel:

    tld {
    -	mask *@*.fr;<
    +	mask *@*.fr;
     	motd "ircd.motd.fr";
     	rules "ircd.rules.fr";
     };
    @@ -1965,19 +2046,25 @@ connecten d OPTIONAL (Früher nicht vorhanden)

    Syntax: -

    except tkl {
    +
    except tkl {
     	mask <hostmask>;
     	type <type>;
    -};
    + type { + <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. +Masken angeben, die von den gesetzten tkl Banns (also G-Lines, Shuns, GZ +Lines) auf breitere Hosts 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.

    +Qlines, Global Qlines und Shuns. Wenn das {} Format benutzt wird, können +unterschiedliche Typen angegeben werden.

    Beispiel:

    except tkl {
     	mask myident@my.isp.com;
    @@ -2181,9 +2268,6 @@ normale ('harte') dcc Banns.

    filename "*.jpg"; /* Bilder sind üblicherweise sicher */ soft yes; };
    -
    allow channel {
    -	channel "#smart_*";
    -};

    4.28 - Vhost Block @@ -2296,6 +2380,7 @@ bekannt als C/N/H:Lines) leaf <leaf-mask>; leafdepth <depth>; class <class-name>; + ciphers <ssl-ciphers> options { <option>; <option>; @@ -2370,6 +2455,12 @@ definiert. Gibt den Kompressions Level (1-9) für diesen Link an. Wird nur verwendet, wenn auch "link::options::zip" gesetzt ist.

    +

    ciphers (optional)
    +Gibt die SSL Verschlüsselung an, die für diesen Link benutzt wird. Um eine +Liste der verfügbaren Verschlüsselungscodes zu erhalten, kann man den 'openssl +ciphers' Befehl benutzen. ciphers ist als eine durch ':' getrennte Liste +anzugeben.  +

    options block
    Eine oder mehrere Optionen für eine Verbindung zu diesem Server. Wird manchmal nicht benötigt.
    @@ -2410,17 +2501,17 @@ nicht vorhanden)

    Syntax [standard alias]:

    alias <name> {
    -	nick <nick-to-forward-to>;
    +	target <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ß +

    Mit dem "alias block [standard alias]" kann festgelegt werden, dass 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 +den Namen des Befehls fest, der das Alias wird, z.B. 'chanserv'. alias::target ist der Nickname, an den weitergeleitet wird. Wenn "alias::" identisch mit -dem Nick ist, an den weitergeleitet wird, kann "alias::nick" +dem Nick ist, an den weitergeleitet wird, kann "alias::target" 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 @@ -2429,7 +2520,7 @@ auch einen weiteren Zweck, der nachfolgend erkl

    Syntax [Befehl alias]:

    alias <name> {
     	format <regex-expression> {
    -		nick <nick-to-forward-to>;
    +		target <nick-to-forward-to>;
     		type <type-of-alias>;
     		parameters <parameter-string>;
     	};
    @@ -2445,7 +2536,7 @@ erstellen.  alias::
     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
    +durchführen zu lassen. alias::format::target ist das Ziel (der Name), 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
    @@ -2453,32 +2544,10 @@ 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;
    -};

    - +weiteren") Zusätzlich kann man %n angeben, was durch den Nicknamen des +Users ersetzt wird, der den befehl ausgeführt hat. Um Beispiele zum Alias Block +zu sehen, schaue man in doc/example.conf.

    +

     

    4.33 - Help Block @@ -2539,10 +2608,9 @@ Syntax:
    };

    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.
    +target gibt die Ziele an. Eine Liste möglicher Ausdrücke (z.B.: 'channel') kann hier nachgelesen werden..
    action gibt die Aktion an, die erfolgen soll. Eine Liste möglicher -Aktionen kann hier nachgelesen werden.
    +Aktionen (z.B.: 'gline') 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 @@ -2784,18 +2852,22 @@ Legt die ersten Zeichen eines verdeckten Hosts (+x) fest. 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.

    +setzen. Optional kann für diesen Wert ein username@host angegeben werden.

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

    +setzen.Optional kann für diesen Wert ein username@host angegeben werden.

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

    +Legt den Hostnamen fest, der co-admins zugewiesen wird, wenn sie +x setzen.Optional +kann für diesen Wert ein username@host angegeben werden.

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

    +Legt den Hostnamen fest, der Admins zugewiesen wird, wenn sie +x setzen.Optional +kann für diesen Wert ein username@host angegeben werden.

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

    +Legt den Hostnamen fest, der Service-Admins zugewiesen wird, wenn sie +x setzen.Optional +kann für diesen Wert ein username@host angegeben werden.

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

    +Legt den Hostnamen fest, der Netadmins zugewiesen wird, wenn sie +x setzen.Optional +kann für diesen Wert ein username@host angegeben werden.

    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 diff --git a/doc/unreal32docs.es.html b/doc/unreal32docs.es.html index c272db4d9..6f903a941 100644 --- a/doc/unreal32docs.es.html +++ b/doc/unreal32docs.es.html @@ -1,2928 +1,2978 @@ - - - -UnrealIRCd - 3.2 - Documentación oficial - - - - - - - -English | -German | -Spanish | -Hungarian -

    -

    UnrealIRCd
    - http://www.unrealircd.com
    - Versión: 3.2.1
    - Versión actual : 3.2.1
    - Última actualización del documento: 2004-07-03
    -
    - Programadores: Stskeeps / codemastr / Syzop / Luke
    - Contribuciones: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
    - Documentación: CKnight^ / Syzop
    - Traducción al español: Trocotronic (irc.rallados.net)
    -

    Debido a la crecida de la complejidad de UnrealIRCd3.2, hemos cambiado una documentación más detallada para una más fácil navegación. Para ver esta documentación debe tener un navegador compatible. Tiene un listado debajo. Los documentos actualizados están disponibles en http://www.vulnscan.org/UnrealIrcd/unreal32docs.html - y una FAQ en http://www.vulnscan.org/UnrealIrcd/faq/. -

    -

    Navegadores compatibles:
    -

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

    -

    ÍNDICE / TABLA DE CONTENIDOS
    - 1. Introducción y notas
    - ---1.1. Notas al actualizar de 3.1.x a 3.2
    - ---1.2. Notas al actualizar entre versiones 3.2
    - 2. Instalación
    - 3. Características
    - -- 3.1. Cifrado
    - -- 3.2. Módulos
    - -- 3.3. Máscaras de usuario
    - -- 3.4. Aliases
    - -- 3.5. Helpop
    - -- 3.6. Niveles de acceso a operadores
    - -- 3.7. Comandos para operadores
    - -- 3.8. SSL
    - -- 3.9. IPv6
    - -- 3.10. Zip links
    - -- 3.11. Soporte conexión DNS/IP dinámico
    - -- 3.12. Características anti-flood
    - -- 3.13. Tipos de ban
    - -- 3.14. Filtro de spam
    - -- 3.15. CIDR
    - -- 3.16. Otras características
    - 4. Configurando su fichero unrealircd.conf
    - ---4.1. Explicación del archivo
    - ---4.2. Bloque me -=- (M:Line)
    - ---4.3. Bloque admin -=- (A:Line)
    - ---4.4. Bloque class -=- (Y:Line)
    - ---4.5. Bloque allow -=- (I:Line)
    - ---4.6. Bloque listen -=- (P:Line)
    - ---4.7. Bloque oper -=- (O:Line)
    - ---4.8. Bloque drpass -=-(X:Line)
    - ---4.9. Directriz include
    - ---4.10. Directriz loadmodule
    - ---4.11. Bloque log
    - ---4.12. Bloque TLD -=- (T:Line)
    - ---4.13. Bloque ban nick -=- (Q:Line)
    - ---4.14. Bloque ban user -=- (K:Line)
    - ---4.15. Bloque ban ip -=- (Z:Line)
    - ---4.16. Bloque ban server -=-(q:Line)
    - ---4.17. Bloque ban realname -=- (n:Line)
    - ---4.18. Bloque ban version
    - ---4.19. Bloque ban exception -=- (E:Line)
    - ---4.20. Bloque TKL exception
    - ---4.21. Bloque throttle exception
    - ---4.22. Bloque deny DCC -=- (dccdeny.conf)
    - ---4.23. Bloque deny version -=- (V:Line)
    - ---4.24. Bloque deny link -=- (D:Line / d:Line)
    - ---4.25. Bloque deny channel -=- (chrestrict.conf)
    - ---4.26. Bloque allow channel
    - ---4.27. Bloque allow DCC
    - ---4.28. Bloque vhost -=- (vhost.conf)
    - ---4.29. Bloque badword -=- (badwords.conf)
    - ---4.30. Bloque uline -=- (U:Line)
    - ---4.31. Bloque link -=- (C/N/H:Lines)
    - ---4.32. Bloque alias
    - ---4.33. Bloque help
    - ---4.34. Bloque official channels
    - ---4.35. Bloque spamfilter
    - ---4.36. Bloque set -=- (networks/unrealircd.conf)
    - 5. Archivos adicionales
    - 6. Modos de usuario y canal
    - 7. Comandos de usuario y operador
    - 8. Consejos de seguridad
    - ---8.1. Contraseñas
    - ---8.2. Vulnerabilidades no-IRCd
    - ---8.3. Permisos y archivo de configuración
    - ---8.4. Problemas de usuario
    - ---8.5. SSL/SSH y análisis de conexión
    - ---8.6. Ataques Denegación de Servicio (DoS) [o: cómo proteger mi hub]
    - ---8.7. Información descubierta
    - ---8.8. Protección contra agujeros explotables
    - ---8.9. Sumario
    - 9. Dudas más comunes (FAQ)
    -

    -

    1.0 – Introducción y notas
    -

    -

    Este documento se escribió exclusivamente para el uso con UnrealIRCd. El uso de este documento con otro programa - o la distribución de este documento con otro programa - está terminantemente prohibida sin los permisos de escritura del Equipo de Desarrollo de UnrealIRCd. - Este documento se puede copiar, imprimir, reproducir o publicar tantas veces se quiera, para el uso de UnrealIRCd y sin - modificación alguna. – Copyright UnrealIRCd Development Team 2002-2004

    -

    Por favor lea este manual antes de solicitar ayuda, el 80% de las dudas más frecuentes están en una - FAQ. Si todavía requiere ayuda, - puede encontrarla en irc.ircsystems.net (puerto 6667) canal #unreal-support (nota: - le pedimos que sean dudas relacionadas con UnrealIRCd, no con servicios). - Si ha encontrado un error (como un bloqueo del programa) notifíquelo en - http://bugs.unrealircd.org.

    -
    - -

    1.1 – Notas al actualizar de 3.1.x a 3.2
    -

    -
    -

    En el caso que esté actualizando desde Unreal3.1.x a Unreal3.2 apreciará que toda la configuración ha cambiado. - Lo encontrará difícil en un principio, pero una vez la haya cambiado encontrará que es mucho mejor.

    -

    No olvide leer la sección 3 sobre las características, todo y que conocerá algunas de 3.1.x existen cuantiosas mejoras.

    -

    No se recomienda unir servidores 3.1.x con 3.2. Aun así, si quiere hacerlo deberá ser a partir de la versión 3.1.4, pero se recomienda encarecidamente 3.1.5.1.

    -
    - -

    1.2 – Notas al actualizar entre versiones 3.2
    -

    -

    La mejor manera de actualizar es:
    -Linux:
    -

      -
    • Renombre su antiguo directorio UnrealIRCd (o deberá sobreescribirlo en el próximo paso) -
    • Extraiga la nueva versión y ejecute ./Config y make -
    • Copie sus antiguos archivos de configuración al nuevo directorio (unrealircd.conf, motd, rules, server.* [certificados SSL], archivo network, etc)

      -
    -Windows:
    -
      -
    • Copie todos sus archivos de configuración a un directorio temporal. -
    • Ejecute el desinstalador si tiene una versión antigua. -
    • Ejecute el instalador de la nueva versión. -
    • Copie todos sus archivos de configuración al nuevo directorio. -
    -

    Por favor lea .RELEASE.NOTES para saber los últimos cambios. - Si notifica algún cambio (o errores) entre versiones, hágalo después de haber leído el fichero.

    -
    - -

    2.0 - Instalación
    -

    -
    - Sistemas operativos soportados y testeados:
    -
      -
    • Versiones *NIX: -
        -
      • Linux 2.2.x -
      • Linux 2.4.x -
      • FreeBSD 4.6-STABLE -
      • FreeBSD 4.5-STABLE -
      • Solaris 2.x -
      -
    • Versiones Windows: -
        -
      • WindowsXP Home -
      • WindowsXP Pro -
      • Windows 2000 Pro -
      • Windows 2000 Server -
      • Windows 2000 Advanced Server -
      • Windows 98 -
      • Windows Me -
      -
    -
    - Si tiene Unreal3.2 trabajando correctamente en otros sistemas, - envíe los detalles a docs@unrealircd.com
    -

    -

    Instrucciones de instalación
    -Linux:
    -

      -
    1. gunzip -d Unreal3.2.tar.gz -
    2. tar xvf Unreal3.2.tar -
    3. cd Unreal3.2 -
    4. ./Config -
    5. Responda a las preguntas que se le formulen. Si no conoce alguna, utilice el valor por defecto. -
    6. make -
    7. Cree su archivo unrealircd.conf y otros archivos de configuración. Vea la sección 4. -
    -

    -Windows:
    -

      -
    1. Ejecute el instalador. -
    2. Cree su archivo unrealircd.conf y otros archivos de configuración. Vea la sección 4. -
    -

    -

    -

    3.0 - Características -

    -
    -

    Algunas de las características más relevantes se explican en esta sección. Da una idea general de su potencia - y a veces hace referencia al archivo de configuración (algo que quizás no conozca todavía).

    -

    Puede omitir esta sección, sin embargo es interesante leerla antes y despues de la instalación.

    -
    - -

    3.1 - Cifrado

    -
    -

    Las direcciones host de los usuarios se encriptan mediante un cifrado. Por ejemplo, si su host es d5142341.cable.wanadoo.nl, - se mostrará (en join, part, whois, etc) como rox-2DCA3201.cable.wanadoo.nl. - Esta medida es muy útil para prevenir ataques entre usuarios.

    -

    Está controlado por el modo de usuario +x (uso: /mode tunick +x). Los administradores pueden forzar el uso por defecto, o restringir su uso.

    -

    Un host cifrado está generado por un módulo (requerido). Actualmente existen dos módulos oficiales:
    - cloak: Este es el nuevo módulo de cifrado que es mucho más seguro que el viejo. Usa md5 internamente y requiere la especificación de tres claves set::cloak-keys:: alfanuméricas [ej: "AopAS6WQH2Os6hfosh4SFJHs"]. Mire el archivo example.conf para hacerse una idea.
    - oldcloak: Es el viejo cifrado usado por Unreal3.2 y anteriores. Sólo se recomienda su uso en procesos de migración y actualización. No se considera seguro (se le avisará de ello si lo usa) y deberá utilizar 'cloak' tan pronto como sus servidores puedan.

    -

    Las claves de cifrado (en adelante "cloak keys") deben ser las mismas en todos los servidores de la red. Procure que estas claves sean secretas. Si alguien las conociera, podría decodificar el host original, lo que provocaría la pérdida de efectividad del modo de usuario +x.

    -
    -

    3.2 - Módulos

    -
    -

    UnrealIRCd soporta módulos que aportan cuantiosas ventajas:
    - - Puede cargarlos, refrescarlos y descargarlos mientras tiene el servidor abierto (usando /rehash). Esto le permite corregir fallos o disponer de las nuevas mejoras de los módulos cargados y todo sin la necesidad de reiniciar.
    - - Otra gente puede crear nuevos módulos con nuevos comandos, modos de usuario e incluso modos de canales.
    - UnrealIRCd sólo se distribuye con unos pocos módulos. Visite www.unrealircd.com en módulos o use google para encontrar más.
    -

    Se necesita cargar almenos dos módulos:
    - - El módulo de comandos: commands.so (commands.dll en windows)
    - - El módulo de cifrado: generalmente cloak.so (cloak.dll en windows).

    -
    - -

    3.3 - Máscaras

    -
    -

    Las máscaras de usuario (conocidas como snomasks) son un tipo especial de modo de usuario que controla qué notificaciones del servidor quiere recibir (generalmente usado para operadores).

    -

    Se pueden usar mediante: /mode tu nick +s MÁSCARA. Por ejemplo:: /mode yournick +s +cF
    - Para quitar algunas máscaras, use algo como: /mode tunick +s -c, por ejemplo.
    - Puede quitarse todas las máscaras quitándose simplemente el modo s: /mode tunick -s

    -

    Se disponen de las siguientes máscaras:
    - c - conexiones locales
    - F - conexiones remotas (menos de servidores de servicios)
    - f - notificaciones de flood
    - k - notificaciones de desconexiones forzadas [*]
    - e - notificaciones de información
    - j - notificaciones de medidas
    - v - notificaciones de hosts virtuales
    - G - notificaciones de gline/shun
    - n - notificaciones de cambios de nicks locales
    - N - notificaciones de cambios de nicks remotos
    - q - notificaciones de denegación de nicksdeny nick (Q:line)
    - s - notificaciones del servidor [*]
    - S - notificaciones del filtro de spam
    - [*: disponible para usuarios no operadores]
    -

    -

    Puede controlar qué máscaras puede obtener (set::snomask-on-connect) y cuáles para operadores (set::snomask-on-oper, oper::snomask)

    -
    - -

    3.4 - Aliases

    -

    Con los aliases puede configurar comandos de usuario. Puede, por ejemplo, permitir "/ns identify blah" sea redirigido a nickserv (que se traduciría como: privmsg nickserv identify blah). Puede incluso hacer aliases más complejos como /register sea redirigido a chanserv si el primer parámetro empieza por # o a nickserv si no empieza.

    -

    Los aliases se configuran con los bloques alias en el archivo de configuración y puede incluír varios archivos en el mismo para la mayoría de servicios.

    -
    - -

    3.5 - Helpop

    -

    UnrealIRCd tiene un sistema accesible de ayuda usando /helpop. Este comando es completamente configurable vía el bloque help. Además, se incluye el archivo help.conf con algunas nociones básicas para todos los comandos soportados.
    - Por ejemplo, /helpop chmodes le muestra una lista de todos los modos de canal que tiene UnrealIRCd.
    - Recuerde que si es un operador (helpop) tiene que prefijar los mensajes con '?'. Así, /helpop es /helpop ? y /helpop chmodes es /helpop ?chmodes etc..

    -
    - -

    3.6 - Niveles de acceso a operadores

    -
    -

    Existen varios niveles de operadores en UnrealIRCd y puede utilizar privilegios adicionales (como el uso de /gline) para cada uno, según los que necesite el operador.

    -

    Se controla mediante opciones en el bloque oper. Vea el bloque oper para más información.

    -
    - -

    3.7 - Comandos para operadores

    -
    -

    UnrealIRCd tiene muchos comandos para operadores, explicados en Comandos de usuario y operadores.

    -
    - -

    3.8 - SSL

    -

    SSL se entiende por Secure Socket Layer. Con SSL puede hacer conexiones encriptadas de una forma segura. Puede usarse para encriptar conexiones servidor a servidor y de cliente a servidor. Usará SSL para proteger contra análisis y para una autentificación de la otra máquina.

    -

    Necesita tener compilado su servidor con soporte SSL. Además, necesitará disponer de un puerto SSL, configurable en listen::options::ssl.

    -

    No puede conectar normalmente a un puerto SSL. Así, no podrá usar el puerto 6667 para SSL. Además se requiere un cliente o una pasarela que entienda el protocolo SSL.

    -

    Clientes que soportan SSL: XChat, - irssi, - mIRC (6.14 y posteriores, - con pasos adicionales)

    -

    Para clientes que no soporten SSL puede usar una pasarela como stunnel. Aquí tiene un ejemplo (para stunnel 4.x):
    -

    -   client = yes
    -   [irc]
    -   accept = 127.0.0.1:6667
    -   connect = irc.myserv.com:6697
    -
    - Entonces, si conecta a 127.0.0.1 en el puerto 6667, su tráfico será encriptado y enviado a irc.myserv.com - en el puerto 6697 (puerto SSL). -

    -

    Probablemente necesitará validar certificados cuando conecte a un servidor y no los acepte a ciegas (como en el ejemplo anterior). Si no, será todavía vulnerable a ataques por análisis de conexión ("sniffing"). Sin embargo, es muy denso para explicar aquí (lea información sobre SSL, no nos pregunte). [mIRC y xchat muestran una ventana preguntando si aceptar o rechazar el certificado, eso es bueno].

    -
    -

    3.9 - IPv6

    -

    UnrealIRCd soporta IPv6. Desde la versión beta15 parece ser estable.
    - Su sistema opertivo necesita tener soporte IPv6 y tenerlo activado en UnrealIRCd en ./Config.
    -

    Aun así, microsoft ha añadido una implementación experimental para w2k/XP que no soporta UnrealIRCd (todavía).

    -
    - -

    3.10 - Zip links

    -

    Zip links se pueden utilizar para conexiones servidor a servidor, que comprime el tráfico usando zlib. Puede ahorrar un 60-80% del ancho de banda. Así pues, puede serle util para conexiones de baja capacidad o para conexiones con muchos usuarios.

    -

    Para compilar con soporte zip links necesita responder Yes a la pregunta zlib en ./Config configurar link::options::zip (en ambos servidores).

    -
    - -

    3.11 - Soporte conexión DNS/IP dinámico

    -
    -

    UnrealIRCd tiene algunas características (nuevas) que ayudan a usuarios con IP dinámicas a usar DNS dinámicos (como blah.dyndns.org). Si está conectando dos DNS dinámicos, entonces establezca link::options::nodnscache y link::options::nohostcheck. -

    -
    - -

    3.12 - Características anti-flood

    -
    -

    -Throttling
    -Throttling es un método que le permite fijar un límite de cuántas veces pueden los usuarios conectarse y desconectarse de su servidor. Puede configurarlo en el bloque set::throttle para permitir X conexiones en YY segundos para la misma IP.
    -Modos de canal
    -Existen varios modos de canal para prevenir ataques. Algunos son:
    -K = no /knock, N = no cambios de nick, C = no CTCPs, M = sólo usuarios reigstrados (+r) pueden hablar.
    -Desde la versión beta18 eixste el modo +f que es mucho más avanzado...
    -Modo de canal f
    -En vez de usar scripts y bots para proteger un canal contra floods ahora se incluye en el propio ircd.
    -Un ejemplo del modo +f es:*** Blah sets mode: +f [10j]:15
    -Significa que se permiten 10 joins cada 15 segundos. Si se supera este límite el servidor pondrá el modo +i automáticamente.
    -Aquí se detallan los tipos de flood: -
    - - - - - - - - - - - - - - - - - - -
    tipo:nombre:acción por defecto:otras acciones:comentarios
    cCTCPsauto +Cm, M 
    jjoinsauto +iR 
    kknocksauto +K para clientes locales
    mmessages/noticesauto +mM 
    nnickchangesauto +N  
    ttextkickbantiguo +f. Expulsará o baneará al usuario
    -

    -  Ejemplo: -

    -*** 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
    -
    - -De hecho, puede complicarse más:
    -En vez de usar la acción por defecto, puede especificar otras como por ejemplo: +f [20j#R,50m#M]:15
    -Esto pondrá el canal en +R si se sobrepasa el límite de 20 joins en 15 segundos y pondrá el modo +M si se superan los 50 mensajes en 15 segundos.
    -
    -Además, se puede especificar el tiempo de duración de este modo: +f [20j#R5]:15 pondrá el canal en +R si se sobrepasa el límite y lo quitará después de 5 minutos.
    -El servidor puede usar un tiempo para quitar los modos por defecto (set::modef-default-unsettime). Así, si usa+f [20j]:15 se pasa a +f [20j#i10]:15, que es por defecto, pero puede seguir usando[20j#i2]:15 y para no quitar nunca este modo +f [20j#i0]:15 (usando 0).
    -
    -El viejo modo +f todavía está disponible como 't', +f 10:6 pasa a ser +f [10t]:6 y +f *20:10 es +f [20t#b]:10. Actualmente el ircd convierte este cambio. Fíjese que no hay tiempo para quitar este modo ([20t#b30]:15 no funcionará).
    -
    -¿Cuál es la mejor combinación? No existe el modo +f perfecto para todos los canales, pero puede guiarse con el siguiente ejemplo para ajustarlos a sus necesidades:
    -+f [30j#i10,40m#m10,7c#C15,10n#N15,30k#K10]:15
    -30 joins en 15 segundos, si se supera el límite se pone el modo +i durante 10 minutos
    -40 mensajes en 15 segundos, si se supera el límite se pone el modo +m durante 10 minutos
    -7 ctcps en 15 segundos, si se supera el límite se pone el modo +C durante 15 minutos
    -10 cambios de nick en 15 segundos, si se supera el límite se pone el modo +N durante 15 minutos
    -30 knocks en 15 segundos, si se supera el límite se pone el modo +K durante 10 minutos
    -Especialmente, quitar los modos es importante. Imagínese un canal sin operadores, el modo estaría durante 15 minutos, en el que la gente no podría hablar, dependiendo del tipo de flood.
    - -

    3.13 - Tipos de ban

    -
    -

    -Tipos de ban básicos y hosts cifrados
    -UnrealIRCd soporta los bans básicos como +b nick!user@host.
    -Además, si un host cifrado como 'rox-ACB17294.isp.com' y pone un ban a *!*@rox-ACB17294.isp.com, -entonces si el usuario se pone -x (y su host es 'dial-123.isp.com') el ban continuará siendo vigente. Los bans se comprueban con los hosts virtuales y reales.
    -También se admiten bans a la IP (ej: *!*@128.*) y siempre se comprueba.
    -
    -Los bans a IPs cifradas requieren una atención especial: -
    -Si el usuario tiene la IP 1.2.3.4 y su host cifrado es 341C6CEC.8FC6128B.303AEBC6.IP, entonces:
    -Si pone +b *!*@341C6CEC.8FC6128B.303AEBC6.IP estará baneando*!*@1.2.3.4 (obviamente)
    -Si pone +b *!*@*.8FC6128B.303AEBC6.IP estará baneando a *!*@1.2.3.*
    -Si pone +b *!*@*.303AEBC6.IP estará baneando a *!*@1.2.*
    - Puede serle útil cuando decida poner un ban.
    -
    - Tipos de ban extendidos
    - Un ban extendido sigue este formato ~[!]<tipo>:<ban>. Se soportan los tipos:
    - - - - - - - - - - - - - - - - - - - -
    tipo:nombreexplicación
    ~qquietLos usuarios que coincidan con este ban no podrán hablar, a menos que tenga +v o superior. Ej: ~q:*!*@blah.blah.com
    ~nnickchangeLos usuarios que coincidan con este ban no podrán cambiarse el nick, - a menos que tenga +v o superior. Ej: ~n:*!*@*.aol.com
    ~cchannelSi el usuario está en ese canal no podrá entrar. -Ej: ~c:#lamers
    ~rrealnameSi su realname coincide no podrá entrar
    - Ej: ~r:*Stupid_bot_script*
    - NOTA: un guión bajo ('_') coincide con un espacio (' ') y un guión bajo. Será lo mismo - 'Stupid bot script v1.4'.
    -Estos bans también se soportan por la lista de excepciones (+e).
    -Los módulos pueden añadir otros tipos de ban. -
    -

    - -

    3.14 - Filtro de spam

    -
    -

    El filtro de spam es un nuevo sistema para luchar contra el spam, la publicidad, los guasnos y otras cosas. Trabaja como las badwords pero con algunas ventajas.

    -

    Los filtros spam se añaden vía /spamfilter que utiliza la sintaxis:
    - /spamfilter [add|del|remove|+|-] [tipo] [acción] [tkltiempo] [razón] [regex]
    - - - - - - - - - - - - - - - - - - - -
    [tipo] especifica la ubicación, puede especificar varias ubicaciones: 'c' mensajes de canales, 'p' privados, 'n' notices, 'N' notices al canal, 'P' mensajes part, 'q' mensajes quit, 'd' dcc
    [accción] especifica una acción a tomar (sólo una)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    killdesconecta al usuario
    tempshunpone un shun a la sesión actual del usuario (si reconecta el shun se va)
    shunpone un shun al host
    klinepone una kline al host
    glinepone una gline al host
    zlinepone una zline al host
    gzlinepone una gzline al host
    blocksólo bloquea el mensaje
    dccblockmarca el usuario para no poder enviar más DCCs
    viruschanfuerza su salida de todos los canales, fuerza su entrada a set::spamfilter::virus-help-channel, desactiva todos los comandos menos PONG, ADMIN y mensajes a set::spamfilter::virus-help-channel
    [tkltiempo] Duración de la *line añadida por el filtro, use '-' para el valor por defecto o para saltarlo (ej: si la acción es 'block')
    [razón] Motivo de la *line. No puede usar espacios, pero los guiones bajos ('_') se transforman en espacios. Los guiones bajos dobles ('__') en simples ('_'). Use '-' para una razón por defecto.
    [regex] expresión regular que debe ser filtrada
    -
    - Por ejemplo: /spamfilter add pc gline - - Come watch me on my webcam
    - Si se encuentra el texto come watch me on my webcam en un privado o mensaje a canal entonces se bloquea el mensaje y se le pone una gline.
    - Otro ejemplo: /spamfilter add pc block - - come to irc\..+\..+
    - Es una expresión regular que concuerda con Hi, come to irc.blah.net etc.
    - Y un ejemplo especificando la razón y el tiempo::
    - /spamfilter add p gline 3h Please_go_to_www.viruscan.xx/nicepage/virus=blah Come watch me on my webcam
    - Si se encuentra come watch me on my webcam en un privado el usuario es glineado para tres horas con la razón Please go to www.viruscan.xx/nicepage/virus=blah.
    -
    - Los filtros de spam añadidos con /spamfilter son globales en la red. Trabajan pase lo que pase aunque el usuario tenga +G. Sólo los operadores y servicios de red están excemtos del filtrado. -

    Puede añadir filtros de spam en el archivo de configuración pero estos filtros serán locales. Su uso se describe en el bloque spamfilter here
    -

    -

    set::spamfilter::ban-time permite modificar el valor por defecto del tkltiempo (por defecto 1 día)
    - set::spamfilter::ban-reason permite especificar una razón por defecto (por defecto 'Spam/advertising')
    - set::spamfilter::virus-help-channel permite especificar un canal para forzar la entrada en la acción 'viruschan' (por defecto #help)
    - set::spamfilter::virus-help-channel-deny permite bloquear los joins normales al canal virus-help-channel (por defecto no)
    -

    - -

    3.15 - CIDR

    -

    UnrealIRCd dispone de soporte para CIDR (Classless Interdomain Routing). CIDR te permite banear rangos de IPs. Todas las IPs se localizan en los ISPs usando CIDR. Así pues, pudiendo banear fácilmente un ISP. Unreal soporta CIDR para IPv4 y IPv6. Las máscaras CIDR se pueden usar en allow::ip, ban user::mask, ban ip::mask, except ban::mask, except throttle::mask y except tkl::mask (para gzline, gline y shun). Además, se puede utilizar CIDR en /kline, /gline, /gzline, /zline y /sun. Se utiliza el estándar de IP/bits, por ejemplo, 12.0.0.0/8 (es 127.0.0.0 - 127.255.255.255) y fe80:0:0:123::/64 (es -fe80:0:0:123:0:0:0:0 - fe80:0:0:123:ffff:ffff:ffff:ffff).

    -
    - -

    3.16 - Otras características

    -
    -

    UnrealIRCd tiene muchísimas más características que no se detallan... Deberá encontrarlas por usted mismo.

    -
    - -

    -

    4.0 - Configurando su unrealircd.conf

    -
    -

    Antes de todo, crear un buen archivo unrealircd.conf puede tomarle algo de tiempo, probablemente entre 10 y 60 minutos. Puede intentar hacer uno rápido y mejorarlo más tarde, o puede aprender las secciones directamente paso a paso. Si tiene problemas, compruebe su sintaxis, compruebe el manual y la FAQ antes de preguntar o notificar un fallo.

    -
    -

    4.1 Archivo de configuración
    -

    -

    -

    El nuevo sistema está basado en bloques. Cada entrada, o bloque, tiene un formato concreto, parecido a:

    -
    -<nombre-bloque> <valor-bloque> {
    -	<directriz-bloque> <valor-directriz>;
    -};
    -

    -

    <nombre-bloque> es el tipo de bloque, como me o admin. <valor-bloque> a veces requiere un valor, como /oper login, pero la mayoría de veces será un sub-tipo como en ban user.

    -

    <directriz-bloque> es una variable individual del bloque, y <valor-directriz> es su valor asociado. Si <valor-directriz> - contiene espacios, o caracteres que representan un comentario, deberá entrecomillarlo. Si quiere usar una doble comilla, deberá escaparla \".

    -

    Un <bloque-directriz> puede tener varias directrices. Si es el caso, tendrá sus propias subsecciones. Algunos bloques sólo requieren un <valor-bloque>, como ocurre en include. Fíjese que no hay un formato fijado, significa que el bloque entero puede aparecer en una o varias líneas. El formato mencionado es el más utilizado (y el que se usará en adelante) porque facilita su lectura.

    -

    Nota: el archivo es sensible a mayúsculas/minúsculas. Es una notación especial usada para refererirse a las entradas. Por ejemplo, hablar de <nombre-directriz>, está diciendo <nombre-bloque>::<directriz-bloque>, y si la directriz tiene un subbloque, deberá añadir otros :: y el nombre de la subdirectriz.

    -

    Hablar sobre una directriz sin nombre deberá hacerlo con <nombre-bloque>:: que en este caso significa <valor-bloque>, o puede tener un subbloque sin nombre.

    -

    Se soportan tres tipos de comentario:

    -

    # Una sola línea
    - // Una sola línea
    - /* Varias
    -     líneas */
    -

    -

    Ahora que ya conoce como funciona, cree su archivo unrealircd.conf o cópielo de doc/example.conf y edítelo. Es recomendable ir paso a paso.

    -

    -

    4.2 - Bloque me - REQUERIDO (conocido como M:Line) -

    -

    -

    Sintaxis:
    -

    -me {
    -	name <nombre-del-servidor>;
    -	info <descripción-servidor>;
    -	numeric <numérico>;
    -};
    -

    -

    Estos valores se sobreentienden. name especifica el nombre del servidor, info su descripción y numeric el numérico con el que se identifica el servidor. Debe ser un valor entre 1 y 255 y debe ser único en la red. Otro servidor no podrá tener el mismo numérico.

    -

    Ejemplo:
    -

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

    -

    -

    4.3 - Bloque admin - REQUERIDO (conocido como A:Line) -

    -

    -

    Sintaxis:
    -

    -admin {
    -	<text-line>;
    -	<text-line>;
    -};
    -

    -

    -

    El bloque admin define el texto a mostrar en /admin. Puede especificar tantas líneas como quiera que contengan, pero se suele incluir el nick de los administradores y alguna dirección e-mail de referencia.

    -

    Ejemplo:
    -

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

    -

    -

    4.4 - Bloque class - REQUERIDO (conocido como Y:Line) -

    -

    -

    Sintaxis:
    -

    -class <nombre> {
    -	pingfreq <frecuencia-ping>;
    -	connfreq <frecuencia-connect>;
    -	maxclients <máximo-clientes>;
    -	sendq <cola-de-salida>;
    -	recvq <cola-de-llegada>;
    -};
    -
    -

    -

    -

    Este bloque contiene qué conexiones deben relacionarse. Generalmente tendrá varias clases, para servidores, clientes, operadores.

    -

    name es un nombre descriptivo de la clase, como "clients" o "servers", que se usará para la referencia

    -

    pingfreq es el número de segundos de PINGs entre servidores (se recomienda un valor entre 90 y 180)

    -

    connfreq se usa sólo para servidores y es el número de segundos para el intento de conexión si está activado autoconnect

    -

    maxclients especifica el número máximo de clientes o servidores que puede albergar la clase

    -

    sendq especifica la cantidad de tráfico que puede enviar (muy alto para servidores con poco ancho de banda y mediano para clientes)

    -

    recvq especifica la cantidad de tráfico que puede recibir y se usa para evitar flood (sólo se aplica en usuarios). Pruebe con valores entre 3000 y 8000, que es el valor por defecto

    -

    Ejemplos:
    -

    -class clients {
    -	pingfreq 90;
    -	maxclients 500;
    -	sendq 100000;
    -	recvq 8000;
    -};
    -
    -class servers {
    -	pingfreq 90;
    -	maxclients 10; /* máximo de servidores unidos al mismo tiempo */
    -	sendq 1000000;
    -	connfreq 100; /* segundos antes de cada intento de conexión */
    -};
    -
    -

    -

    -

    4.5 - Bloque allow - REQUERIDO (conocido como I:Line) -

    -

    -

    Sintaxis:
    -

    -allow {
    -	ip <user@máscara-ip>;
    -	hostname <user@máscara-host>;
    -	class <clase-de-conexión>;
    -	password <contraseña> { <tipo-identificación>; };
    -	maxperip <máximo-usuarios-por-misma-ip>;
    -	redirect-server <servidor-a-redirigir>;
    -	redirect-port <puerto-a-redirigir>;
    -	options {
    -		<opción>;
    -		<opción>;
    -		...
    -	};
    -};
    -
    -

    -

    Este bloque define quién puede conectar al servidor. Puede tener varios bloques allow.

    -

    Sobre la correspondencia
    - El control de acceso funciona con ip o hosts, así "hostname *@*;" y "ip *@1.2.3.4;" significa que siempre corresponderá. Además siempre tendrá preferencia el bloque que ponga después del bloque general *@*.  Si quiere relacionar un bloque por ip, entonces fije el hostname a algo inválido, como "hostname NOBODY;", para hacerlo sólo por ip.

    -

    ip
    - La máscara ip es de la forma user@ip, user es la ident, generalmente *, y la ip es la ip en cuestión. Ej: *@* (para todos), *@192.168.* (para direcciones que empiecen por 192.168), etc.

    -

    host
    - También user@host. user user generalmente se pone a *. Ej: *@* (todos), *@*.retevision.es (sólo para retevisión.es).

    -

    password (opcional)
    - Precisa una contraseña para conectar. Puede especificar el método de cifrado de la contraseña.

    -

    class
    - Especifica la clase a la que se relacionará la conexión.

    -

    maxperip (opcional, recomendado)
    - Le permite especificar cuántas conexiones simultáneas se permiten en el servidor.

    -

    redirect-server (opcional)
    - Si la clase está llena, a qué servidor redireccionar los clientes (si el cliente lo soporta [mIRC 6 lo hace]).

    -

    redirect-port (opcional)
    - Si se especifica redirect-server puede especificar el puerto, si no se asume 6667.

    -

    bloque options (opcional)
    - Opciones válidas:
    -   useip siempre usa la ip en vez del host
    -   noident no utiliza la ident especificada por el cliente
    -   ssl sólo relaciona si el cliente usa SSL
    -   nopasscont relaciona aunque no se especifique contraseña (así puede poner clientes en clases diferentes si dan o no dan contraseña) -

    Ejemplos:
    -

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

    -

     

    -

    4.6 - Bloque listen - REQUERIDO (conocido como P:Line) -

    -

    -

    Sintaxis:
    -

    -listen <ip:puerto> {
    -	options {
    -		<opción>;
    -		<opción>;
    -		...
    -	};
    -};
    -
    -

    -

    -

    Este bloque especifica qué puertos deberán escucharse. Si no se requieren opciones, deberá hacerlo sin directrices, con la forma <ip>:<puerto>;.

    -

    ip y puerto
    - Puedes fijar la ip a * para enlazar con todas las ips posibles, o especificar una ip a enlazar (usada en proveedores de shells). El puerto es el puerto que se va a escuchar. Puede especificar un rango. Por ejemplo, 6660-6669 escuchará los puertos desde 6660 hasta 6669, ambos incluídos. Para usuarios IPv6 vea a continuación.

    -

    Información para usuarios IPv6
    - Si tiene un servidor IPv6 necesitará englobar la IP entre llaves, com [::1]:6667 (escucha localhost en el puerto 6667). Si usa IPv6 y quiere escuchar una ip IPv4 necesitará usar ::ffff:ipv4ip. Por ejemplo, [::fff:203.123.67.1]:6667 pondrá en escucha el puerto 6667 de la ip 203.123.67.1. Obviamente puede usar *.

    -

    bloque options (opcional)
    - Puede especificar opciones adicionales:
    - - - - - - - - - - - - - -
    clientsonly
    puerto exclusivo para clientes
    serversonly
    puerto exclusivo para servidores
    java
    soporte CR javachat
    ssl
    puerto SSL
    -

    - -

    Ejemplos:

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

    -

    O si no hay opciones:

    -

    listen *:8067;
    - listen 213.12.31.126:6667;
    - listen *:6660-6669;

    -

    4.7 - Bloque oper - RECOMENDADO (conocido comoO:Line) -

    -

    -

    Sintaxis:
    -
    oper <nombre> {
    -	from {
    -		userhost <hostmask>;
    -		userhost <hostmask>;
    -	};
    -	password <contraseña> { <auth-type>; };
    -	class <clasee>;
    -	flags <flags>;
    -	flags {
    -		<flag>;
    -		<flag>;
    -		...
    -	};
    -	swhois <información whois>;
    -	snomask <snomask>;
    -	maxlogins <num>;
    -};
    -
    -

    El bloque oper permite asignar Operadores de Red para tu servidor. oper:: especifica el nombre de usuario para /oper. oper::from::userhost es una máscara user@host que debe coincidir. Puede especificar más de una máscara usando varios oper::from::userhost. oper::password es la contraseña que deberá especificar, oper::password:: permite especificar un método de cifrado para esta contraseña. Métodos válidos: crypt, md5, sha1 y ripemd-160. Si no utilizará método de cifrado, este bloque puede omitirse.

    -

    Note que es sensible a maýusculas y minúsculas.

    -

    La directriz oper::class especifica el nombre de una clase preexistente (que aparezca antes del archivo) y es a la que relacionará el operador.

    -

    La directriz oper::flags tiene dos formatos. Si quiere usar el antiguo sistema (ej: OAa) deberá usar flags <flags>; si quiere usar el nuevo estilo, flags { <flag>; }. A continuación se detallan los flags soportados:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Antiguo
    Nuevo
    Descripción
    o
    local
    Le hace operador local
    O
    global
    Le hace operador global
    C
    coadmin
    Le hace coadmin
    A
    admin
    Le hace admin
    a
    services-admin
    Le hace admin de servicios
    N
    netadmin
    Le hace administrador de red
    r
    can_rehash
    Puede usar /rehash
    D
    can_die
    Puede usar /die
    R
    can_restart
    Puede usar /restart
    h
    helpop
    Recibe modo +h (helpop)
    w
    can_wallops
    Puede usar /wallops
    g
    can_globops
    Puede usar /globops
    c
    can_localroute
    Puede conectar servidores localmente
    L
    can_globalroute
    Puede conectar servidores remotamente
    k
    can_localkill
    Puede usar /kill en usuarios locales
    K
    can_globalkill
    Puede usar /kill en usuarios remotos
    b
    can_kline
    Puede usar /kline
    B
    can_unkline
    Puede usar /kline -user@host
    n
    can_localnotice
    Puede enviar notificaciones locales
    G
    can_globalnotice
    Puede enviar notificaciones globales
    z
    can_zline
    Puede usar /zline
    t
    can_gkline
    Puede usar /gline, /shun y /spamfilter
    Z
    can_gzline
    Puede usar /gzline
    W
    get_umodew
    Recibe modo +W
    H
    get_host
    Fija su host de operador
    v
    can_override
    Puede usar OperOverride
    q
    can_setq
    Puede usar el modo de usuario +q
    X
    can_addline
    Puede usar /addline
    d
    can_dccdeny
    Puede usar /dccdeny y /undccdeny
    -

    Algunos flags se incluyen al recibirse:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    localglobaladmin/coadminservices-adminnetadmin
    can_rehashcan_rehashcan_rehashcan_rehashcan_rehash
    helpophelpophelpophelpophelpop
    can_globopscan_globopscan_globopscan_globopscan_globops
    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
    -

    La directriz oper::swhois añade una línea adicional a su whois. [opcional]

    -

    La directriz oper::snomask fija las máscaras de servidor que recibirá. Vea la sección 3.3 - [opcional]

    -

    La directriz oper::maxlogins restringe el número de intentos para hacerse operador. Si lo fija a 1, sólo podrá haber un operador usando este bloque al mismo tiempo [opcional]

    - -

    Ejemplo:
    -

    -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 "Example of a whois mask";
    -	snomask frebWqFv;
    -};
    -
    -

    -Un poco sobre OperOverride:
    -OperOverride tiene aspectos como entrar en canales con +ikl, saltarse bans (deberá usar /invite antes), opearse en el canal, etc.
    -El operflag can_override fue añadido para evitar este abuso. No está por defecto, deberá especificarlo expresamente para cada operador. -

    -

    4.8 - Bloque drpass - RECOMENDADO (conocido como X:Line) -

    -

    Sintaxis:
    -

    -drpass {
    -	restart <contraseña-reinicio> { <auth-type>; };
    -	die <contraseña-fin> { <auth-type>; };
    -};
    -

    -

    Este bloque fija las contraseñas para /restart y /die con drpass::restart y drpass::die respectivamente. Las directrices drpass::restart:: y drpass::die:: permiten especificar un método de cifrado de contraseñas. Los métodos soportados son crypt, md5, sha1 y ripemd-160.

    -

    Eejemplo:

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

    -

    -

    4.9 - Directriz include -

    -

    -

    Sintaxis:
    - include <archivo>;

    -

    Especifica el archivo a cargar como archivo de configuración. Puede contener configuraciones de bloques e incluso contener otros archivos. Se permite el uso de comodines en el nombre del archivo para cargar varios archivos a la vez.

    -

    ejemplo 1: un archivo de red
    -

    include mynetwork.network;

    -

    Usará un archivo de red por separado, aunque ya no se necesitan; toda la configuración de red puede insertarse directamente en el archivo unrealircd.conf.

    -

    ejemplo 2: aliases
    -

    include aliases/ircservices.conf

    -

    Otro ejemplo para incluir aliases. UnrealIRCd viene con varios archivos que contienen aliases para la mayoría de servicios:
    -

      -
    • 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 - Directriz loadmoule - REQUERIDO -

    -

    -

    Sintaxis:
    - loadmodule <archivo>;

    -

    Vea aquí por qué son útiles.

    -

    Los módulos que vienen de serie con Unreal3.2:

    -

    commands.so / commands.dll - Todos los comandos (casi todos) REQUERIDO
    - cloak.so / cloak.dll - Módulo de cifrado REQUERIDO (u otro módulo de cifrado)

    -

    Cerciórese de cargar estos dos módulos

    -
    -loadmodule "src/modules/commands.so";
    -loadmodule "src/modules/cloak.so";
    -
    -

    o en windows:

    -
    -loadmodule "modules/commands.dll";
    -loadmodule "modules/cloak.dll";
    -
    -
    -

    4.11 - Bloque log - OPCIONAL -

    -

    -

    Sintaxis:
    -

    -log <archivo> {
    -	maxsize <tamaño-máximo>;
    -	flags {
    -		<flag>;
    -		<flag>;
    -		...
    -	};
    -};
    -
    -

    -

    Este bloque permite loguear varios eventos: log:: contiene el nombre del archivo. log::maxsize es opcional y permite especificar el tamaño máximo que puede tener el archivo. Puede entrar este valor usando MB para megabytes, KB para kilobytes y GB para gigabytes. log::flags especifica qué tipo de información va a loguearse. Estos eventos se detallan a continuación.

    -

    Puede especificar varios bloques para loguear varios eventos en distintos archivos.

    -

    Flags disponibles :
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    errorsloguea errores
    killsloguea /kill
    tklloguea información de *lines, shuns y spamfilters
    connectsloguea conexiones/desconexiones de usuarios
    server-connectsloguea conexiones/desconexiones de servidores
    klineloguea el uso /kline
    operintento de oper
    sadmin-commandsloguea el uso de los comandos /sa* (samode, sajoin, sapart, etc.)
    chg-commandsloguea el uso de los comandos /chg* (chghost, chgname, chgident, etc.)
    oper-overrideloguea el uso de operoverride
    spamfilterloguea las coincidencias de spam
    -

    - -

    Ejemplo:

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

    -

    -

    4.12 - Bloque TLD - OPCIONAL (conocido como T:Line) -

    -

    -

    Sintaxis:
    -

    -tld {
    -	mask <hostmask>;
    -	motd <archivo-motd>;
    -	rules <archivo-reglas>;
    -	shortmotd <archivo-shortmotd>;
    -	channel <nombre-canal>;
    -	options {
    -		ssl;
    -	}
    -};
    -

    -

    Este bloque le permite especificar motd, rules y canales para usuarios en función de su host. Es útil para tener varios motds en distintos lenguajes. tld::mask es una máscara user@host que coincide con la máscara del usuario. tld::motd, tld::shortmotd, y tld::rules especifican el motd, shortmod y archivo de reglas espectivamente para mostrar en función del host. tld::shortmotd es opcional. tld::channel es opcional y permite especificar un canal al que el usuario será forzado cuando conecte. Si existe, omitirá el canal por defecto en autojoin. El bloque tld::options le permite definir parámetros adicionales. Sólo existen tld::options::ssl para clientes SSL y tld::options::remote para clientes remotos.

    -

    Las entradas TLD se relacionan de arriba abajo.

    -

    Ejemplo:
    -

    -tld {
    -	mask *@*.es;<
    -	motd "ircd.motd.es";
    -	rules "ircd.rules.es";
    -};
    -

    -

    -

    4.13 - Bloque ban nick OPCIONAL (conocido como Q:Line) -

    -

    -

    Sintaxis:
    -

    -ban nick {
    - mask <nickname>; - reason <razón>; -};
    -

    -

    Este bloque permite deshabilitar el uso de ciertos nicks en su servidor. ban::mask acepta comodines para relacionar varios nicks. ban::reason permite especificar la razón de esta prohibición. Generalmente se usa para los servicios de red.

    -

    Ejemplo:
    -

    -ban nick {
    -	mask "*C*h*a*n*S*e*r*v*";
    -	reason "Reservado para servicios";
    -};
    -

    -

    -

    4.14 - Bloque ban user - OPCIONAL (conocido como K:Line) -

    -

    -

    Sintaxis:
    -

    -ban user {
    -	mask <hostmask>;
    -	reason <razón>;
    -};
    -

    -

    Este bloque permite banear una máscara user@host para que no pueda conectar al servidor. ban::mask es una cadena con comodines. ban::reason es la razón de este bloqueo. Note que sólo es un ban local: el usuario podrá conectar a otro servidor.

    -

    Ejemplo:
    -

    -ban user {
    -	mask *tirc@*.saturn.bbn.com;
    -	reason "Idiota";
    -};
    -

    -

    -

    4.15 - Bloque ban ip - OPCIONAL (conocido como Z:Line) -

    -

    -

    Sintaxis:
    -

    -ban ip {
    -	mask <ipmask>;
    -	reason <razónn>;
    -};
    -

    -

    Este bloque prohibe que determinadas IPs lleguen a conectar al servidor. Incluye tanto a servidores como clientes. ban::mask es una IP que puede contener comodines. ban::reason es la razón de este bloqueo.

    -

    Ejemplo:
    -

    -ban ip {
    -	mask 192.168.1.*;
    -	reason "Coge una ip real lamer";
    -};
    -

    -

    -

    4.16 - Bloque ban server - OPCIONAL (conocido como q:Line) -

    -

    -

    Sintaxis:
    -

    -ban server {
    -	mask <server-name>;
    -	reason <razón>;
    -};
    -

    -

    Este bloque tiene la característica de prohibir la unión de un servidor a la red. Si el servidor se une directamente a su servidor, esta unión se deniega. Si el servidor conecta a uno remoto, el servidor local lo desconectará de la red. ban::mask puede contener comodines y es el nombre del servidor que quiere prohibir. ban::reason es la razón de este bloqueo.

    -

    Ejemplo:
    -

    -ban server {
    -	mask broken.server.my.network.com;
    -	reason "Está cerrado";
    -};
    -

    -

    -

    4.17 - Bloque ban realname - OPCIONAL (conocido como n:Line) -

    -

    -

    Sintaxis:
    -

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

    -

    Este bloque permite banear a clientes en función de su GECOS (realname). Es muy útil para evitar flood de clones, según algunos bots con el mismo realname. ban::mask especifica el nombre a banear y puede contener comodines. ban::reason especifica la razón de este bloqueo.

    -

    Ejemplo:
    -

    -ban realname {
    -	mask "Bob*";
    -	reason "Bob apesta!";
    -};
    -

    -

    -

    4.18 - Bloque ban version - OPCIONAL -

    -

    -

    Sintaxis:
    -

    -ban version {
    -	mask <máscara-versión>;
    -	reason <razón>;
    -	action [kill|tempshun|shun|kline|zline|gline|gzline];
    -};
    -

    -

    Este bloque permite banear el uso de un determinado cliente en función de su programa mediante la respuesta CTCP version. Si el usuario no responde, el ban no prosigue. Es recomendable para evitar scripts maliciosos. ban::mask especifica la versión y puede contener comodines. ban::reason especifica la razón del bloqueo. Puede especificar también ban::action para tomar una medida, kill se usa por defecto. tempshun pondrá un shun a esa conexión. shun/kline/zline/gline/gzline lo harán a la ip (*@ip), la duración se configura en set::ban-version-tkl-time cuyo valor por defecto es de 1 día.

    -

    Ejemplo:
    -

    -ban version {
    -	mask "*SomeLameScript*";
    -	reason "SomeLameScript contiene una puerta trasera";
    -};
    -
    -ban version {
    -	mask "*w00tZombie*";
    -	reason "En ocasiones veo muertos";
    -	action zline;
    -};
    -

    -

    -

    4.19 - Bloque except ban - OPCIONAL (conocido como E:Line) -

    -

    -

    Sintaxis:
    -

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

    -

    Este bloque permitirá al host especificado saltarse los bans. Es útil cuando se banea a todo un proveedor o ISP y quiere permitir la entrada de alguien en concreto. La directriz except::mask especifica la máscara del cliente user@host a permitir.

    -

    Ejemplo:
    -

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

    -

    -

    4.20 - Bloque except tkl OPCIONAL -

    -

    -

    Sintaxis:
    -

    -except tkl {
    -	mask <hostmask>;
    -	type <tipo>;
    -};
    -

    -

    Este bloque permite a un usuario saltarse los bloqueos tkl puestos a su host. Es muy útil cuando se banea a todo un proveedor o ISP y quiere permitir a alguien en concreto. La directriz except::mask especifica la máscara user@host a permitir. except::type especifica el tipo de ban a saltarse. Tipos válidos: gline, gzline, qline, gqline y shun, para Glines, Global Zlines, Qlines, Global Qlines y shuns, respectivamente.

    -

    Ejemplo:
    -

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

    -

    -

    4.21 - Bloque except throttle - OPCIONAL -

    -
    -

    Sintaxis:
    -

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

    -

    Este bloque especifica qué ips se saltarán la protección throttle. Sólo funciona si ha escogido throttle. except::mask especifica la ip a la que no se le aplicará el throttle.

    -

    Ejemplo
    -

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

    -

    -

    4.22 - Bloque deny dcc - OPCIONAL (conocido como dccdeny.conf) -

    -
    -

    Sintaxis:
    -

    -deny dcc {
    -	filename <archivo-a-bloquear>;
    -	reason <razón>;
    -	soft [yes|no];
    -};
    -

    -

    Este bloque permite especificar qué archivos no se pueden enviar vía DCC a través del servidor. Es muy útil para evitar la propagación de virus y troyanos.

    -

    El parámetro deny::filename especifica el archivo en cuestión y puede contener comodines. deny::reason especifica la razón del bloqueo.

    -

    Existe la opción deny::soft que si está fijada a 'yes' el dcc es bloqueado hasta que el usuario lo permite mediante /dccallow +nick. Vea dccallow.conf para más ejemplos.

    -

    Ejemplo:
    -

    -deny dcc {
    -	filename virus.exe;
    -	reason "Virus GD";
    -};
    -
    -deny dcc {
    -	filename "*.exe";
    -	reason "Contenido ejecutable";
    -	soft yes;
    -};
    -

    -

    -

    4.23 - Bloque deny version - OPCIONAL (conocido como V:Line) -

    -

    -

    Sintaxis:
    -

    -deny version {
    -	mask <nombre-servidor>;
    -	version <versión>;
    -	flags <flags-compilación>;
    -};
    -

    -

    Este bloque permite parar la unión de un servidor a la red en función de su versión y sus modos de compilación. El formato de este bloque es algo complicado pero no es muy difícil imaginarselo. La directriz deny::mask especifica una máscara con comodines del servidor al que se le aplica. deny::version especifica el número de protocolo que se refiere.

    -

    Por ejemplo, 3.0 es 2301, 3.1.1/3.1.2 es 2302, 3.2 es 2303. El primer caracter de este parámetro puede ser >, <, = o !. Si es >, todas las versiones superiores a esta son bloqueadas; con < todo lo contrario; con =, sólo esa versión y con ! todas las versiones menos esta. La directriz deny::Flags permite especificar qué modos de compilación debe o no debe tener. Estos modos se ponen uno detrás de otro y si cada modo es prefijado por ! significa que no debe tenerlo.

    -

    -

    4.24 - Bloque deny link - OPCIONAL (conocido como D/d:Line) -

    -

    -

    Sintaxis:
    -

    -deny link {
    -	mask <nombre-servidor>;
    -	rule <expresión-crule>;
    -	type <tipo>;
    -};
    -

    -

    Este bloque permite especificar reglas para denegar la unión de servidores. La directriz deny::mask especifica el nombre de servidor con comodines al que aplicar esta regla. La directriz deny::rule es bastante compleja. Una expresión crule le permite controlar detalladamente y es algo parecido a una expresión de programación. Se soportan cuantro operadores: connected(<servermask>) devuelve true si el servidor conectado coincide, directcon(<servermask>) devuelve true si el servidor está conectado directamente a su servidor, via(<viamask>,<servermask>) devuelve true si el servidor servermask está conectado conectado a viamask y directop() devuelve true si el operador que se usa con /connect está conectado directamente a este servidor. Estos operadores pueden combinarse usando && (y), || (o) y englobados entre llaves. Además, un operador precedido por ! comprueba si devuelve false. Si la expresión entera devuelve true, entonces se deniega el link. deny::type acepta dos valores: auto (sólo para autoconnects, pero /connect seguirá funcionando) y all (aplicado a todos los intentos).

    -

    -

    4.25 - Bloque deny channel OPCIONAL (conocido como chrestrict.conf) -

    -
    -

    Sintaxis::
    -

    -deny channel {
    -	channel "<máscara-canal>";
    -	reason <razón>;
    -	redirect "<nombre-canal>";
    -	warn [on|off];
    -};
    -

    -

    -

    Este bloque deshabilita la entrada a ciertos canales. La directriz deny::channel especifica los nombres de canales, con comodines, a los que los usuarios no pueden entrar. deny::reason, la razón por qué no pueden hacerlo. Además, puede especificar deny::redirect para redirigir a los usuarios a este canal. deny::warn si está en on enviará un notice a los operadores (con la snomask 'e') si algún usuario intenta entrar.

    -

    Ejemplo:

    -
    -deny channel {
    -	channel "#unrealsucks";
    -	reason "Tu si que apestas!";
    -};
    -
    -deny channel {
    -	channel "#*teen*sex*";
    -	reason "Estás salido";
    -	warn on;
    -};
    -
    -deny channel {
    -	channel "#operhelp";
    -	reason "Nuestro canal de ayuda es #help, no #operhelp";
    -	redirect "#help";
    -};
    -

    - -

    -

    4.26 - Bloque allow channel - OPCIONAL -

    -
    -

    Sintaxis:
    -

    -allow channel {
    -	channel "<máscara-canal>";
    -};
    -

    -

    Este bloque especifica los canales a los que los usuarios deben entrar.

    -

    Ejemplo:
    -

    -allow channel {
    -	channel "#algo";
    -};
    -

    -

    -

    4.27 - Bloque allow dcc - OPCIONAL -

    -
    -

    Sinaxis:
    -

    -allow dcc {
    -	filename "<máscara-archivo>";
    -	soft [yes|no];
    -};
    -

    -

    Este bloque permite establecer archivos que puedan ser enviados. Si allow dcc::soft está en 'yes' se aplica a la lista 'soft dcc bans', si está en 'no' se aplica a la lista normal ('hard').

    -

    Ejemplo:
    -

    -allow dcc {
    -	filename "*.jpg"; /* las imágenes son seguras */
    -	soft yes;
    -};
    -

    -

    -

    4.28 - Bloque vhost - OPCIONAL (conocido como vhosts.conf) -

    -
    -

    Sintaxis:
    -

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

    -

    Este bloque permite usar el comando /vhost para obtener un host virtual. El parámetro vhost::vhost puede ser user@host o simplemente el host que el usuario recibirá. vhost::from::userhost contiene las máscaras user@host que deben coincidir para recibir el host virtual. Puedes especificar más de una. vhost::login es el login que utilizará y vhost::password la contraseña. vhost::password:: acepta métodos de cifrado de contraseña como crypt, md5, sha y ripemd-160. vhost::swhois añade una línea extra a su whois.

    -

    Ejemplo:
    -

    -vhost {
    -	vhost my.own.personal.vhost.com;
    -	from {
    -		userhost my@isp.com;
    -		userhost myother@isp.com;
    -	};
    -	login mynick;
    -	password mypassword;
    -	swhois "Soy la monda";
    -};
    -

    -

    -

    4.29 - Bloque badword - OPCIONAL (conocido como badwords.*.conf) -

    -
    -

    Sintaxis:
    -

    -badword <tipo> {
    -	word <texto>;
    -	replace <palabra-reemplazar>;
    -	action <replace|block>;
    -};
    -

    -

    Este bloque permite gestionar la lista de palabras para canales y usuarios con modo +G de "badwords".  badword:: especifica el tipo: channel, message, quit y all. badword::word puede ser una simple palabra o una compleja expresión regular, según lo que necesite. badword::replace es una cadena por la que se reemplazará si coincide. Si se deja en blanco, se reemplazará por "<censored>". badword::action define la acción a tomar: si es replace la reemplazará y si es block bloqueará el mensaje entero. Si se deja en blanco, se asume replace.

    -

    Ejemplo:
    -

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

    -

    -

    4.30 - Bloque ulines - OPCIONAL (conocido como U:Line) -

    -

    -

    Sintaxis: -

    -ulines {
    -	<nombre-servidor>;
    -	<nombre-servidor>;
    -	...
    -};
    -

    -

    Este bloque define ciertos servidores para que tengan habilidades extras. Es recomendable únicamente para servidores de servicios y estadísticas, nunca para servidores normales. Cada entrada es el nombre del servidor.

    -

    Ejemplo:
    -

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

    -

    -

    4.31 - Bloque link - OPCIONAL (conocido como C/N/H:Lines) -

    -
    -

    Sintaxis:
    -

    -link <nombre-servidor> {
    -	username <usermask>;
    -	hostname <ipmask>;
    -	bind-ip <ip-a-enlazar>;
    -	port <puerto-a-conectar>;
    -	password-connect <contraseña-de-conexión-local>;
    -	password-receive <contraseña-de-conexión-remotas> { <auth-type>; };
    -	hub <hub-mask>;
    -	leaf <leaf-mask>;
    -	leafdepth <profundidad>;
    -	class <clase>;
    -	options {
    -		<opción>;
    -		<opción>;
    -		...
    -	};
    -};
    -

    -

    Este bloque es necesario para unir servidores. Tómese su tiempo para leerlo todo porque es bastante complicado y con lo que los usuarios tienen más errores.

    -

    Primero de todo, server-name es el nombre del servidor remoto, al que quiere unir.

    -

    username
    - Puedes especificarlo si tiene una autentificación ident. Normalmente pondrá "*".

    -

    hostname
    - El host o la IP del servidor remoto. Es usado por ambos lados al conectar y en la verificación del servidor que se une. Algunos ejemplos:
    - - - - - - - - - - - - - -
    1.2.3.4 IP normal
    hub.blah.com host: sólo para conexiones salientes, nunca para entrantes a menos que link::options::nohostcheck esté presente
    * no podrá conectar a * pero sí recibir la conexión
    ::ffff:1.2.3.4 unión de ipv6 a ipv4
    -

    -

    bind-ip (opcional)
    - Puede usarse para enlazar con una ip (ej: 192.168.0.1), nunca suele usarse.

    -

    port
    - Puerto a conectar (en el servidor remoto).

    -

    password-connect
    - Es la contraseña para conectar al servidor remoto. Debe ser texto plano.

    -

    password-receive
    - Es la contraseña para validar uniones entrantes y puede ser encriptada (métodos crypt, md5, sha1 y ripemd-160). Puede dejarlo como texto plano. Generalmente es el mismo que la contraseña anterior.

    -

    hub vs leaf
    - Un hub es un servidor con varios servidores unidos a él. Un leaf sólo tiene una unión, a su servidor. Un servidor o es un hub o un leaf, nunca ambos.

    -

    hub (opcional)
    - Este valor es la máscara de los servidores a los que puede conectar (ej: *.mi.red).

    -

    leaf (opcional)
    - Este valor es la máscara que este servidor actuará como leaf.towards. -

    -

    leaf-depth (opcional)
    - Si se especifica, la directriz leaf también debe especificarse. Este valor es la profundidad o número de uniones que puede tener.

    -

    class
    - Es la clase a la se relacionará este servidor, generalmente la clase server.

    -

    compression-level (opcional)
    - Especifica el nivel de compresión (1-9) si se especifica el parámetro link::options::zip.

    -

    bloque options
    - Algunas de las opciones son:
    - - - - - - - - - - - - - - - - - - - -
    ssl si conecta a un puerto SSL
    autoconnect su servidor intentará conectar automáticamente. El tiempo usado entre intentos es el que especificó en class::connfreq (se recomienda para un sólo lado, de leaf a hub)
    zip si quiere usar compresión, ambos servidores deben soportarla
    nodnscache no guarda la IP saliente. Úselo si tiene un host dinámico (como dyndns.org)
    nohostcheck no valida el host remoto (link::hostname). Úselo si tiene un host dinámico (como dyndns.org)
    quarantine los operadores mantendrán el estado de locales, no globales
    -

    -

    Ejemplo:

    -
    -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.32 - Bloque alias - OPCIONAL -

    -
    -

    Sintaxis [alias estándar]:
    -

    -alias <nombre> {
    -	nick <nick-destino>;
    -	type <tipo>;
    -};
    -

    -

    (Nota: puede ver más archivos de alias estándars que lleva UnrealIRCd en este enlace)

    -

    Este bloque (estándar) le permite redireccionar comandos a usuarios, generlamente a bots como por ejemplo /chanserv para enviarle privados. alias:: especifica el nombre del comando, por ejemplo chanserv. alias::nick el nick al que se le enviará el mensaje y puede omitirse. alias::type define el tipo de alias: services (el usuario está en el servidor de servicios), stats (en el de estadísticas) y normal (en un servidor normal). Este bloque tiene otro propósito detallado a continuación.

    -

    Sintaxis [alias de comandos]:
    -

    -alias <nombre> {
    -	format <expresión-regular> {
    -		nick <nick-destino>;
    -		type <tipo>;
    -		parameters <parámetros-del-mensaje>;
    -	};
    -	format <expresión-regular> {
    -		...
    -	};
    -	type command;
    -};
    -

    -

    Este uso es más extenso y tiene más posibilidades. Por ejemplo, puede crear aliases como /identify. alias:: es el mismo que el anterior: el nombre del comando. alias::format especifica la expresión regular que debe coincidir con el texto enviado. Si lo hace, se usan las subentradas. Así puede tener varios alias::format para seguir distintas acciones según la coincidencia, a partir de sus subentradas. alias::format::nick es el nick de destino. alias::format::type es el tipo de alias. alias::format::parameters es lo que se enviará como parámetro al alias. Para especificar un parámetro que se enviará al nick, use % seguido del número de parámetro. Por ejemplo, %1 enviará el primer parámetro. Para especificar todos los parámetros a partir de uno, use %n- donde n es el número de parámetro. Por ejemplo, %2- enviaría todos los parámetros a partir del segundo, incluído. Para más información consulte doc/example.conf.

    -

    -

    4.33 - Bloque help - OPCIONAL -

    -
    -

    Sintaxis:
    -

    -help <nombre> {
    -	<línea>;
    -	<línea>;
    -	...
    -};
    -

    -

    (Nota: use generalmente help.conf)

    -

    Este bloque le permite crear entradas para /helpop. help:: es el valor que se pasará a /helpop como parámetro. Si se omite, se usará si no se envían parámetros a /helpop. Las entradas serán las que se mostrarán al usuario cuando lo solicite.

    -

    - -

    4.34 - Bloque official-channels - OPCIONAL -

    -
    -

    Sintaxis:
    -

    -official-channels {
    -	"#canal" { topic "El topic por defecto"; };
    -};
    -

    -

    Estos canales se muestran en /list, aunque no haya usuarios. topic es opcional y sólo se muestra si tiene 0 usuarios.

    - -

    Ejemplo:
    -

    -official-channels {
    -	"#Help" { topic "Canal oficial de ayuda. Si nadie está presente, use /helpop ayuda"; };
    -	"#Home";
    -	"#Main" { topic "Canal principal"; };
    -};
    -

    -
    - -

    4.35 - Bloque spamfilter - OPCIONAL -

    -
    -

    -Este bloque le permite añadir filtros de spam locales.
    -Vea las características del filtro de spam para más información.
    -

    -

    Sintaxis:
    -

    -spamfilter {
    -	regex <palabra>;
    -	target { <target(s)> };
    -	action <acción>;
    -	reason <razón>;
    -	ban-time <tiempo>;
    -};
    -

    -

    regex es la expresión regular a comparar.
    - target especifica las ubicaciones: channel, private, private-notice, channel-notice, part, quit, dcc.
    - action define la acción a tomar, vea aquí para las acciones posibles.
    - reason opcional: especifica la razón.
    - ban-time opcional: especifica la durada de la *line..
    -

    - -

    Ejemplos:
    -

    -spamfilter {
    -	regex "Come watch me on my webcam";
    -	target { private; channel; };
    -	action gline;
    -	reason "You are infected, please go to www.antivirus.xx/blah/virus=GrrTrojan";
    -	ban-time 6h;
    -};
    -
    -spamfilter {
    -	regex "come to irc\..+\..+";
    -	target { private; channel; };
    -	action gline;
    -	action gline;
    -	reason "No spamming allowed";
    -};
    -

    -
    - -

    4.36 - Bloque set - REQUERIDO (conocido como archivo unrealircd.conf/networks) -

    -
    -

    Este bloque se usa para configurar la red. Si sólo tiene un servidor, puede meterlo todo en el archivo unrealircd.conf. Si tiene varios, se recomienda ponerlo por separado.

    -

    Si su servidor está en una red, puede poner la configuración de red en un archivo aparte y cargarlo con include en cada servidor.

    -

    En este documento, la configuración y directrices están de forma <nombre-bloque>::<nombre-directriz>. Este formato no debe usarse en el archivo, debe convertirse al formato detallado a continuación. Es una representación para simplificar su lectura.

    -

    Sintaxis:
    -

    -set {
    -	<entrada> <valor>;
    -	<entrada> <valor>;
    -	...
    -};
    -

    -

    Este bloque fija las opciones para cada servidor. Cada entrada tiene su propósito que se explica a continuación. Algunas directrices tienen subbloques que también se detallan. Hay varios puntos a prestar atención. Todas las directrices y parámetros deben estar dentro de tan sólo un bloque set. Si una directriz tiene varias opciones, deben incluirse dentro del bloque set.
    - Ejemplo:
    -

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

    -

    Si quiere poner algunos bloques por separado, debe hacerlo en una sóla línea.
    - Ejemplo:
    - set { options { hide-ulines; no-stealth; }; };
    -

    -

    set::kline-address <direción-email>;
    - La dirección email para cualquier referencia. Valor obligado.

    -

    set::modes-on-connect <+modos>;
    - Los modos que se pondrán al usuario al conectar.

    -

    set::snomask-on-connect <+modos>
    - La máscara de noticias que se pondrán al usuario al conectar.

    -

    set::modes-on-oper <+modos>;
    - Los modos que recibirán los operadores cuando hagan /oper.

    -

    set::snomask-on-oper <+modos>;
    - La máscara de noticias que recibirán los operadores.

    -

    set::modes-on-join <+modos>;
    - Los modos que se pondrán a un canal cuando sea creado. No se pueden usar los modos +qaohvbeOAzlLk.

    -

    set::restrict-usermodes <modos>
    - Modos a restringir (no use + o -).
    - Por ejemplo puede usar +G en modes-on-connect y G en restrict-usermodes para que no puedan quitarse este modo.

    -

    set::restrict-channelmodes <modos>
    - Modos a restringir en canales (no use + o -).
    - Por ejemplo puede usar +G en modes-on-join y G en restrict-channelmodes para que no puedan quitar este modo.
    - NOTA: es posible usar esta característica con la opción MLOCK de los servicios si se diera el caso. Sin embargo no podemos dar soporte a eso.

    -

    set::restrict-extendedbans <tipos|*>
    - No se permite el uso de bans extendidos ("*") o algunos en concreto (ej: "qc").

    -

    set::auto-join <canaless>;
    - Los canales a los que se forzará el usuario a entrar. Para especificar varios, use la coma.
    - [Nota: no olvide entrecomillarlo, como auto-join "#chan";]

    -

    set::oper-auto-join <canales>;
    - Los canales a los que se forzará el operador entrar. Para especificar varios, use la coma.
    -[Nota: no olvide entrecomillarlo, como auto-join "#chan";]

    -

    set::anti-spam-quit-message-time <tiempo>;
    - Tiempo que debe transcurrir entre /quit para que el mensaje sea mostrado. Úselo para prevenir el abuso de publicidad. Si el valor es una cadena alfanumérica, use d para días, h para horas, m para minutos y s para segundos. Por ejemplo 1d2h3m significa 1 día, 2 horas y 3 minutos.

    -

    set::prefix-quit <prefijo>;
    - Prefijo que se usará para preceder los mensajes en desconexiones voluntarias. Si se pone a 0 se usa "Quit:".

    -

    set::static-quit <mensaje quit >;
    - Fija un mensaje permanente en desconexiones. Sea cual sea el mensaje del usuario siempre se mostrará este. Elimina la necesidad de usar anti-spam-quit-message-time, como también prefix-quit. No reemplaza errores con el mensaje static-quit.

    -

    set::static-part <no|yes|mensaje part>;
    - Si se usa 'yes' se quitan todos los mensajes part. Con 'no' no modifica nada. Cualquier otro valor se usará como comentario. Puede ser algo confuso, úselo con determinación.

    -

    set::who-limit <límite>;
    - Límite de entradas a mostrar en /who. Si se omite, no hay límite.

    -

    set::silence-limit <límite>;
    - Límite de entradas en la lista silence. Si se omite, el límite es de 15.

    -

    set::oper-only-stats <lista-stats>;
    - Lista de stats que sólo los operadores pueden usar en /stats. Omítalo para permitir a los usuarios ver toda la información o "*" para restringirla toda a operadores. Sólo se aceptan las stats en forma corta.

    -

    set::oper-only-stats {<stats-flag>; <stats-flag>;};
    - El caso anterior pero con stats en forma larga.

    -

    set::maxchannelsperuser <nº-canales>;
    - Límite de canales que pueden entrar los usuarios al mismo tiempo.

    -

    set::maxdccallow <nº-entradas>;
    - Límite de entradas en la lista dccallow.

    -

    set::channel-command-prefix <prefijo>;
    - Especifica el prefijo para mostrar el mensaje a los usuarios que estén con +d. Suele usarse para bots. Si se omite, el prefijo es "`".

    -

    set::allow-userhost-change [never|always|not-on-channels|force-rejoin]
    - Especifica qué hacer cuando el user@host cambia (+x/-x/chghost/chgident/setident/vhost/etc.).
    - never deshabilita todos los comandos, always los permite aunque estén en canales (causa desincronización) [por defecto], not-on-channels si el usuario no está en ningún canal, force-rejoin forzará al usuario a reentrar en los canales y se le dará op/voz, etc. si fuera necesario.

    -

    set::options::hide-ulines;
    - Si está presente, los servidores u-line no se muestran en /links si lo solicita un usuario no operador.

    -

    set::options::flat-map;
    - Si está presente, los servidores aparecerán directamente unidos en /map y /links, sin saber a qué servidor están unidos. Es una pequeña ayuda para evitar ataques (D)DoS a los servidores importantes o puntos vitales de la red.

    -

    set::options::show-opermotd;
    - Si está presente, se mostrará el opermotd cuando hagan /oper con éxito.

    -

    set::options::identd-check;
    - Si está presente, se comprobará el servidor ident y devolverá el valor del username. Si no devuelve nada o no existe servidor ident, el username se prefijará con ~. Si se omite, no se hace la comprobación.

    -

    set::options::show-connect-info;
    - Si está presente, se muestran los mensajes "ident request", "hostname lookup", etc. cuando el usuario conecte.

    -

    set::options::dont-resolve;
    - Si está presente, no se resolverán los hosts. Puede ser útil para acelerar la conexión.
    - Note que si no se usa, el bloque allow deberá basarse en ips, no en hosts.

    -

    set::options::mkpasswd-for-everyone;
    - Todos los usuarios pueden usar /mkpasswd.

    -

    set::options::allow-part-if-shunned;
    - Permite usar /part a los usuarios con shun.

    -

    set::dns::timeout <timevalue>;
    - Tiempo de espera del servidor DNS si no obtiene respuesta. Si el valor es una cadena alfanumérica, use d para días, h para horas, m para minutos y s para segundos. Por ejemplo 1d2h3m significa 1 día, 2 horas y 3 minutos.

    -

    set::dns::retries <nº-intentos>;
    - Número de intentos si el servidor DNS no obtiene respuesta.

    -

    set::dns::nameserver <name-of-dns-server>;
    - Especifica el host del servidor a usar en las búsquedas DNS.

    -

    set::network-name <nombre-de-red>;
    - Fija el nombre de la red. Debe ser el mismo en todos los servidores.

    -

    set::default-server <nombre-servidor>;
    - Define el servidor por defecto a conectar si la clase está llena.

    -

    set::services-server <nombre-servidor>;
    - Especifica el nombre del servidor de los servicios. Requerido. Use un valor aleatorio como servicios.mi.red si no dispone de ellos.

    -

    set::stats-server <nombre-servidor>;
    - Especifica el nombre del servidor de estádisticas. Si no dispone de ellas, puede omitir este valor.

    -

    set::help-channel <canal-ayuda>;
    - Canal de ayuda.

    -

    set::cloak-keys { "clave1"; "clave2"; "clave3"; };
    - Fija las claves de cifrado para generar los hosts virtuales. Deben ser las mismas en toda la red. Deben ser cadenas de 5 a 100 caracteres (con 10-20 es suficiente) alfanuméricas: a-z, A-Z y 0-9. Según el módulo de cifrado cargado, usará otras reglas.

    -

    set::hiddenhost-prefix <prefijo>;
    - Define el prefijo del host virtual. Suele ser un reflejo del nombre de la red.

    -

    set::hosts::local <vhost-locop>;
    - Define el host que se les asignará a los operadores locales si llevan +x.

    -

    set::hosts::global <vhost-globop>;
    - Define el host que se les asignará a los operadores globales si llevan +x.

    -

    set::hosts::coadmin <vhost-coadmin>;
    - Define el host que se les asignará a los co-admin si llevan +x.

    -

    set::hosts::admin <vhost-admin>;
    - Define el host que se les asignará a los administradores si llevan +x.

    -

    set::hosts::servicesadmin <vhost-admin-servicios>;
    - Define el host que se les asignará a los administradores de servicios si llevan +x.

    -

    set::hosts::netadmin <vhost-admin-red>;
    - Define el host que se les asignará a los administradores de red si llevan +x.

    -

    set::hosts::host-on-oper-up <yes/no>;
    - Si está en 'yes', recibirán el host automáticamente acompañado del modo +x si no lo tuvieran. Si no, deberán ponerse el modo +x manualmente.

    -

    set::ssl::egd <archivo>;
    - Especifica el archivo EGD (Entropy Gathering Daemon) para SSL. Si usa OpenSSL 0.9.7 o mayor, entonces se buscan por defecto las rutas /var/run/egd-pool, /dev/egd-pool, /etc/egd-pool, - y /etc/entropy y no es necesario especificarlo, simplemente dejándolo en blanco (set::ssl::edg).

    -

    set::ssl::certificate <archivo>;
    - Especifica la ubicación del archivo de certificado SSL.

    -

    set::ssl::key <archivo>;
    - Especifica la ubicación del archivo de llave privada SSL.

    -

    set::ssl::trusted-ca-file <filename>;
    - Especifica la ubicación del archivo de los CAs permitidos.

    -

    set::ssl::options::fail-if-no-clientcert;
    - Sólo acepta clientes con certificado.

    -

    set::ssl::options::no-self-signed;
    - Sólo acepta clientes con un certificado no propio.

    -

    set::ssl::options::verify-certificate;
    - Verifica la autenticidad del certificado SSL antes de la conexión.

    -

    set::throttle::period <tiempo>
    - Tiempo que debe esperar el usuario para volver a conectar si rebasa el número de intentos de conexión.

    -

    set::throttle::connections <nº>;
    - Número de veces que puede conectar con el mismo host sin que se le haga throttle.

    -

    set::ident::connect-timeout <segundos>;
    - Número de segundos que debe esperar a obtener respuesta del servidor ident. (por defecto: 10s).

    -

    set::ident::read-timeout <segundos>;
    - Número de segundos que debe esperar respuesta (por defecto: 30s).

    -

    set::anti-flood::unknown-flood-bantime <tiempo>;
    - Especifica el tiempo que debe estar bloqueado una conexión desconocida por flood.

    -

    set::anti-flood::unknown-flood-amount <kbs>;
    - Especifica la cantidad de tráfico (en kilobytes) que una conexión desconocida puede enviar antes de ser desconectada.

    -

    set::anti-flood::away-flood <veces>:<periodo>
    - Protección flood por away: límita el número de veces que puede usarse /away dentro de un periodo de segundos. Requiere tener activado NO_FLOOD_AWAY en config.h. Por ejemplo: away-flood 5:60s; significa podrán usar /away un máximo de 5 veces cada 60 segundos.

    -

    set::anti-flood::nick-flood <veces>:<periodo>
    - Protección flood por nick: límita el número de veces que se pueden cambiar el nick dentro de un periodo de segundos. Por ejemplo: nick-flood 4:90; significa que sólo podrán cambiarse el nick 4 veces cada 90 segundos. Por defecto: 3 cada 60s.

    -

    set::default-bantime <tiempo>
    - Tiempo por defecto en comandos como /kline, /gline, /zline, /shun, etc. sin parámetro. Por defecto es permanente (0).

    -

    set::modef-default-unsettime <valor>
    - Tiempo por defecto para quitar un modo que se ponga debido al efecto de +f. Por ejemplo: si especifica 10, se transformarán a +f [5j#i10]:15. Por defecto no hay tiempo para quitar el modo.

    -

    set::modef-max-unsettime <valor>
    - Máximo de minutos que pueden especificar en el modo +f (+f [5j#i<TIEMPO>]:15). Debe ser un valor entre 0 y 255. Por defecto 60 (1 hora).

    -

    set::ban-version-tkl-time <valor>
    - Especifica cuánto debe durar una acción como zline/gline/etc en ban version. Por defecto 86400 (1 día).

    -

    set::spamfilter::ban-time <valor>
    - Similar a la directriz anterior pero para filtros de spam.

    -

    set::spamfilter::ban-reason <razón>
    - Razón por defecto en los filtros de spam.

    -

    set::spamfilter::virus-help-channel <canal>
    - Canal usado para la acción viruschan en los filtros de spam.

    -

    set::spamfilter::virus-help-channel-deny <yes|no>
    - Si está en 'yes' (o '1') sólo los usuarios invitados por el filtro de spam pueden entrar en ese canal, a excepción de los operadores.

    -

    set::spamfilter::except <target(s)>
    - Estos "target(s)" se omiten del filtro de spam (no se toma ninguna acción). Puede especificar varios separándolos con comas. Ej: except "#help,#spamreport";.

    -
    -

    5 – Archivos adicionales -

    -
    - Además de los archivos de configuración, Unreal tiene varios archivos como MOTD, OperMOTD, BotMOTD y Rules. Vea los usos que tiene cada uno.
    - Note que los archivos motd (todos los tipos) y rules pueden especificarse en el bloque tld. Sólo son los archivos por defecto (y para MOTD/RULE's remotos). -

      - - - - - - - - - - - - - - - - - - - - - -
    ircd.motdSe muestra cuando se usa /motd y (si ircd.smotd no está presente) cuando el cliente conecta
    ircd.smotdSe muestra al conectar solamente (short MOTD, motd corto)
    ircd.rulesSe muestra cuando se usa /rules
    oper.motdSe muestra cuando se usa /opermotd o cuando se identifican como operadores
    bot.motdSe muestr cuando se usa /botmotd
    -

    -

    6 – Modos de usuario y canal -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Modo
    Descripcción
    Channel Modes
    A
    Sólo pueden entrar administradores
    a <nick>
    Hace de nick administrador del canal
    b <nick!user@host>
    -
    Pone un ban
    c
    No se pueden enviar colores ANSI
    C
    No se permiten CTCP's
    e <nick!user@host>
    Exception ban – si alguien coincide, siempre podrá entrar al canal aunque esté baneado
    f * <líneas:segundos>
    Protección flood. Si se especifica * el usuario será baneado y expulsado si envía más de líneas en menos de segundos. Si no se usa *, sólo se expulsa
    G
    Marca el canal con la lista de "badwords"
    M
    Sólo pueden hablar los usuarios registrados (+r)
    h <nick>
    Da el estado de semi operador del canal a nick
    i
    Se precisa invitación
    K
    No se permite /knock
    k <clave>
    Se precisa clave para entrar
    l <##>
    Fija el número máximo de usuarios que puede haber en el canal
    L <#canal>
    Si se pasa el límite del +l, los usuarios son enviados directamente a este canal
    m
    Canal moderado: sólo +v y superiores pueden hablar
    N
    No se permiten cambios de nick en el canal
    n
    No se permiten mensajes externos
    O
    Sólo operadores pueden entrar
    o <nick>
    Da el estado de operador del canal a nick
    p
    Marca el canal como privado
    q <nick>
    Marca nick como fundador del canal
    Q
    Sólo los servidores uline pueden expulsar a los usuarios
    R
    Sólo pueden entrar usuarios registrados (+r)
    S
    Quita todos los colores
    s
    Hace el canal secreto
    t
    Sólo halfops y superiores pueden cambiar el tema del canal
    T
    No se permiten notices al canal
    u
    Auditorium – Sólo se muestran los operadores del canal en /names o /who #canal
    V
    No se permite /invite
    v <nick>
    Da voz a los usuarios (pueden hablar en canales +m)
    z
    Sólo pueden entrar usuarios conectados bajo SSL
    -

     

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Modo
    Descripción
    Modos de usuario
    r
    Identifica al nick como registrado
    s
    Puede escuchar las notificaciones del servidor
    v
    Rechaza los DCC infectados automáticamente
    o
    Operador de red global
    O
    Operador de red local
    B
    Es un bot
    i
    Invisible (no se muestra en /who)
    A
    Administrador de servidor
    x
    Da al usuario un host virtual
    q
    Sólo ulines pueden expulsarle (sólo administradores de servicios)
    a
    Administrador de servicios
    g
    Puede leer y escribir globops y locops
    H
    Oculta el estado de operador de red
    S
    Protege a los servicios de red
    t
    Nota que el usuario usa un host virtual
    C
    Co administrador
    d
    No recibe mensajes de canal
    N
    Administrador de Red
    w
    Puede recibir wallops
    h
    Disponible para ayuda (HelpOp)
    G
    Filtra las palabras con la lista "badwords"
    W
    Le permite ver cuando le hacen /whois
    p
    Oculta sus canales de /whois
    R
    Le permite recibir mensajes de usuarios registrados (+r)
    V
    Usuario WebTV
    z
    Cliente SSL
    T
    Le previene de recibir CTCPs
    -

    -

    7 – Tabla de comandos para usuarios y operadores

    -
    -

    NOTA: /helpop muestra información más actualizada. Use /helpop comando (o /helpop ?comando si es operador) para obtener más información sobre ese comando.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Comando
    Descripcción
    Quién
    nick <nuevo_nick>Cambia tu nick. Alerta de ello a los demás usuarios.
    Todos
    whois <nick>Muestra información sobre el nick. Incluye el nombre completo, host, canales en los que está y el estado de operador, entre otros
    Todos
    who <patrón>Le permite buscar usuarios. El patrón incluye: nick, #canal, host (*.attbi.com)
    Todos
    whowas <nick> [max_respuestas]Muestra información sobre un nick desconectado. Puedes especificar un max_respuestas como máximo de entradas mostradas
    Todos
    ison <nick1 nick2 nick3 ...>Le permite comprobar si están conectados ciertos usuarios. Usado generalmente por scripts
    Todos
    join <canal1,canal2, ...>Le permite unirse en varios canales. Si usa /join 0 sale de todosTodos
    cycle <canal1,canal2, ...>Reentra de los canales especificados. Es equivalente a usar PART y luego JOINTodos
    motd [servidor]Muestra el motd del servidor. Añadiendo un servidor, muestra el motd de ese servidor
    Todos
    rules [servidor] Muestra las reglas del servidor. Añadiendo un servidor, muestra las reglas de ese servidorTodos
    lusers [servidor] Muestra los usuarios actuales y el número máximo de usuarios en la red, globales y locales. Añadiendo un servidor, muestra los usuarios de ese servidor
    Todos
    mapMuestra el mapa de la red Todos
    quit [razón] Le desconecta del servidor. Si incluye una razón, se mostrará en los canales en los que estéTodos
    ping <usuario> Envía una petición PING a un usuario. Se usa para medir el lag. Entre servidores, se usa para verificar que todavía sigue conectado
    Todos
    version <nick>Envía un CTCP version a un usuario. Si pertoca, el cliente responderá a ella
    Todos
    linksMuestra una lista de los servidores de la redTodos
    admin [servidor] Muestra la información de contacto del servidor. Si se añade un servidor, muestra la información de ese servidor
    Todos
    userhost <nick>Muestra el userhost del nick dado. Generalmente se usa en scripts
    Todos
    topic <canal> [tema]Topic <canal> muestra el tema del canal. Topic <canal> <mensaje> fija como tema del canal ese mensaje
    Todos
    invite <nick> <canal>Invita a este nick a un canal (debe ser operador del canal)
    Op Canal
    kick <canal,canal> <user, user> [razón]Expulsa a un o varios usuarios de un canal o varios canales. Puede incluir un motivo
    Op Canal
    away <razón>Le marca como ausente. Puede incluir una razón
    Todos
    Watch +-<nick> +-<nick>
    Watch es un sistema de notificaciones en UnrealIRCd, siendo más rápido ya que usa menos recursos de red que el viejo sistema. El servidor le envía un mensaje cuando un usuario de su lista watch se desconecta o se conecta. Esta lista no se conserva a cada sesión (su cliente o script deberá enviarla cada vez que se conecte)Todos
    helpop ?<tema> or !<tema>
    HelpOp es un nuevo sistema de ayuda. Puede usar /helpop ? <tema> o /helpop ! <tema>. Si usa "?" busca la ayuda en el propio programa. Si no obtiene ayuda, use "!" para mandarlo a los operadores de red. Si no usa ni "?" ni "!" primero consulta en la ayuda interna y si no la encuentra la manda a los operadoresTodos
    list <patrón> - Si no incluye un patrón, se le manda la lista de canales sin filtrar. El patrón acepta estas opciones:
    - >n Lista los canales con más de n personas
    - <n Lista los canales con menos de n personas
    - C>n Lista los canales creados entre ahora y hace n minutos
    - C<n Lista los canales creados antes de hace n minutos
    - T>n Lista los canales cuyos topics son mas antiguos que n minutos (que no han cambiados hace n minutos)
    - T<n Lista los canales cuyos topics son mas nuevo que hace n minutos
    - *máscara* Lista los canales que concuerdan con *máscara*
    - !*máscara* Lista los canales que no concuerdan con *máscara*
    Todos
    Knock <canal> <mensajee>
    Le permite hacer 'knock' en un canal para invitados preguntando por su invitación. No funcionará si el canal está en +V y +K, o si está baneado
    Todo
    setnameLe permite cambiar su nombre completo sin necesidad de reconectar
    Todos
    vhost <login> <contraseña>Oculta su host usando un host virtual proporcionado por el servidor
    Todos
    mode <canal/nick> <modo>
    Le permite cambiar los modos de un canal o sus propios modos. Vea Modos de usuario y canales para más información
    Todos
    creditsMuestra los créditos de la gente que ha ayudado a crear UnrealIRCd
    Todos
    licenseMuestra la licencia GNU Todos
    time [servidor] Muestra la fecha y la hora del servidor. Si añade un servidor, lo hace de ese servidor
    Todos
    botmotd [servidor]
    Muestra el mensaje para bots del servidor. Si añade un servidor, muestra el de ese servidor Todos
    identify <contraseña> Envía su contraseña a los servicios para identificarse como dueño de su nick
    Todos
    identify <canal> <contraseña>Envía su contraseña a los servicios para identificarse como fundador del canal Todos
    dns <opción>Devuelve información sobre el caché DNS de los servidores. Muchos clientes llevan este comando incluído, por ello se recomienda usar /raw DNS. Los operadores pueden especificar una l en el primer parámetro para recibir la lista de entradas DNSTodos
    oper <userid> <contraseña>
    Comando para identificarse como operador de red
    IRCop
    wallops <mensaje>Envía un mensaje a los usuarios con +wIRCop
    globops <mensaje>Envía un mensaje a todos los IRCops IRCop
    chatops <mensaje>Envía un mensaje a todos los IRCops con +cIRCop
    locops <mensaje>Envía un mensaje a todos los IRCops locales IRCop
    adchat <mensaje>Envía un mensaje a todos los Administradores IRCop
    nachat <mensaje>Envía un mensaje a todos los Administradores de Red IRCop
    kill <nick> <razón>Desconecta a un usuario de la red IRCop
    kline [+|-]<user@host | nick> [<duración> <razón>]Banea la máscara host del servidor. Una kline no es un ban global, tan sólo local.
    - duración es: a) un valor en segundos, b) un valor de tiempo como '1d' es un día o c) '0' par que sea permanente. La duración y razón son opcionales. Si no se especifican se toman los valores de set::default-bantime y razón como 'no reason'
    - Para quitar una kline use /kline -user@host
    IRCop
    zline [+|-]<*@ip> [<duración> <razón>]Banea una dirección IP del servidor local. Vea kline para más información. Use /zline -*@ip para quitarlaIRCop
    gline [+|-]<user@host | nick> [<duración> <razón>]
    Añade un ban global. Vea kline para más información. Use /gline -user@host para quitarla
    IRCop
    shun [+|-]<user@host | nick> [<duración> <razón>]
    Previene de que un usuario ejecute cualquier comando. Son globales. Vea kline para más información. Use /shun -user@host para quitarlo
    IRCop
    gzline [+|-]<ip> [<duración> <razón>]
    Añade una zline global. Vea kline para más información. Use /gzline -*@ip para quitarla
    IRCop
    rehash <servidor> –<opciones>Refresca los archivos de configuración de los servidores. Añadiendo un servidor, lo hará en ese servidor. Puede pasarle varias opciones:
    - -motd - Sólo refresca todos los motd y rules (incluyendo el bloque tld)
    - -opermotd - Sólo el archivo opermotd
    - -botmotd - Sólo el archivo botmotd
    - -garbage - Fuerza un garbage collection
    -
    IRCop
    restart <servidor <contraseña>
    Reinicia el servidor. Se requiere una contraseña. Puede especificar qué servidor quiere reiniciar
    IRCop
    die <contraseña>
    Cierra el servidor. Requiere contraseñaIRCop
    lag <servidor>
    Este comando actúa como un trazado. Puede escribir /lag servidor y todos los servidores por los que pase este comando le responderán. Así verá qué puntos de la red hay más lagIRCop
    sethost <nuevohost>Le permite cambiar su host al que quiera
    IRCop
    setident <nuevaident>
    Le permite cambiar su ident a la que quiera IRCop
    chghost <nick> <nuevohost>
    Cambia el host de un usuario IRCop
    chgident <nick> <nuevaident>
    Cambia la ident de un usuario IRCop
    chgname <nick> <nuevonombre>
    Cambia el nombre de un usuarioIRCop
    squit <servidor>
    Desconecta a un servidor de la red IRCop
    connect <servidor> [[<puerto>] <servidor>]Si sólo se da un servidor, intentará conectar a ese servidor. Si especifica dos servidores, intentará conectarlos entre sí. Ponga primero el leaf y luego el hub
    IRCop
    dccdeny <archivo> <razón>
    Prohibe el envío de un archivo o de archivos que coincidan con este
    IRCop
    undccdeny <archivo>
    Quita una entrada anterior IRCop
    sajoin <nick> <canal>, <canal>
    Fuerza a un usuario a entrar en estos canales IRCop
    sapart <nick> <canal>, <canal>
    Fuerza a un usuario a salir de estos canales IRCop
    samode <canal> <modos>
    Permite a los Administradores de Red y Servicios cambiar los modos de un canal
    IRCop
    rping <servidor>
    Calcula en milisegundos el lag entre servidores
    IRCop
    trace <servidor|nick>
    Devuelve la clase y el lag. Si lo usa sobre un servidor, le devuelve la clase y versión
    IRCop
    opermotd
    Le muestra el opermotd
    IRCop
    addmotd :<texto>
    Añade el texto al final del motd
    IRCop
    addomotd :<texto>
    Añade el texto al final del opermotd
    IRCop
    sdesc <descripción>
    Introduce una nueva descripción del servidor sin reiniciar
    IRCop
    addline <texto>
    Le permite añadir líneas al archivo unrealircd.conf
    IRCop
    mkpasswd <contraseña>
    Encripta un texto para añadirlo en unrealircd.conf
    IRCop
    tsctl offset +/- <tiempo>
    Ajusta el reloj interno del IRCD (no lo use si no sabe lo qué es)
    IRCop
    tsctl time
    Le da el tiempo TS IRCop
    tsctl alltimeLe da el tiempo TS de todos los servidores IRCop
    tsctl svstime <timestamp>
    Fija el tiempo TS en todos los servidores (no lo use si no sabe lo qué es)
    IRCop
    htm <opción>
    Controla el tráfico. En modo HTM básicamente deshabilita el uso de comandos como list, whois o who, puesto que ocupan mucho ancho de banda. Opciones:
    - -ON Servidor en HTM
    - -OFF Servidor fuera de HTM
    - -NOISY Informa a los usuarios administradores cuando se entra y sale del modo HTM
    - -QUIET No informa el caso anterior
    - -TO <valor> Especifica el ratio a usar
    IRCop
    stats <opción>
    - B - banversion - Lista de bans
    - b - badword - Lista de badwords
    - C - link - Lista del bloque link
    - d - denylinkauto - Lista del bloque deny link (auto)
    - D - denylinkall - Lista del bloque deny link (todo)
    - e - exceptthrottle - Lista del bloque except throttle
    - E - exceptban - Lista del bloque except ban
    - f - spamfilter - Lista de filtros de spam
    - F - denydcc - Lista del bloque deny dcc
    - G - gline - Lista gline
    -   Flags: [+/-mrs] [máscara] [razón] [autor]
    -     m Devuelve las glines que coincidan o no con la máscara
    -     r Devuelve las glines que coincidan o no con la razón
    -     s Devuelve las glines que coincidan o no con el autor
    - I - allow - Lista bloque allow
    - j - officialchans - Lista de canales oficiales
    - K - kline - Lista del bloque ban user/ban ip/except ban
    - l - linkinfo - Información de las uniones de servidores
    - L - linkinfoall - Toda la información anterior
    - M - command - Lista del uso de cada comando
    - n - banrealname - Lista del bloque ban realname
    - O - oper - Lista del bloque oper
    - S - set - Lista del bloque set
    - s - shun - Lista de shuns
    -   Flags: [+/-mrs] [máscara] [razón] [autor]
    -    m Devuelve las glines que coincidan o no con la máscara
    -    r Devuelve las glines que coincidan o no con la razón
    -    s Devuelve las glines que coincidan o no con el autor
    - P - port - Información sobre puertos
    - q - sqline - Lista sqline
    - Q - bannick - Lista del bloque ban nick
    - r - chanrestrict - Lista del bloque channel deny/allow
    - R - usage - Uso de los recursos
    - t - tld - Lista del bloque tld
    - T - traffic - Información del tráfico de datos
    - u - uptime - Uptime del servidor
    - U - uline - Lista del bloque ulines
    - v - denyver - Lista del bloque deny version
    - V - vhost - Lista del bloque vhost
    - X - notlink - Lista servidores que están separados de la red
    - Y - class - Lista del bloque class
    - z - zip - Información sobre la compresión zlib (si está compilado así)
    - Z - mem - Uso de memoria
    -
    Todos
    module
    - Lista todos los módulosTodos
    close
    - Cierra todas las conexiones desconocidasIRCop
    - -

    - -

    8 – Consejos de seguridad

    -
    -

    Si está preocupado por la seguridad (debería), esta sección le ayudará. Alternativamente puede usarlo como patrones a seguir en toda la red para afianzarla.

    -

    Esta lista está ordenada de mayor a menor riesgo.

    -

    - -

    8.1 Contraseñas
    -

    -Escoja buenas contraseñas para los operadores, links, etc:
    -- Use contraseñas alfanuméricas ("Wfw9eAe") y/o palabras largas.
    -- No use estas contraseñas para aspectos como cuentas de email, foros, etc.
    -

    - -

    8.2 Vulnerabilidades no-IRCD
    -

    -Hay varios aspectos que no están relacionados con el ircd pero que pueden ser puntos potenciales de ataque. Si por ejemplo usa servidores http, dns, smtp y ftp pueden ayudar al factor riesgo. Úselos en cuentas shells y utilice buenos permisos para utilizarlos.
    -

    - -

    8.3 Permisos y archivo de configuración
    -

    -Cerciórese de que su directorio home y UnrealIRCd tienen los permisos correctos. Por otro lado, un usuario local puede coger su archivo para ver las contraseñas. Para evitar esto: chmod -R go-rwx /path/to/Unreal3.2 si no está seguro de ello.
    -Más aspectos. Nunca ponga su UnrealIRCd en un webroot o cualquier otro directorio compartido. Para las copias de seguridad, asegúrese de los permisos.
    -
    -Use siempre que pueda contraseñas encriptadas. La mayoría de contraseñas de 1-8 caracteres se descifran en cuestión de horas o pocos días, sobretodo las contraseñas link::password-connect
    -

    - -

    8.4 Problemas de usuario
    -

    -Muchos de estos problemas no están en esta temática.
    -Escoja siempre operadores y administradoers de confianza. Léase todo detenidamente. Nunca comparta sus discos mediante netbios/kazaa/morpheus/etc. puede coger troyanos. Está bajo su responsabilidad.
    -

    - -

    8.5 SSL/SSH y análisis de conexión
    -

    -Use SSL entre servidores y entre clientes operadores para prevenir el "robo" de contraseñas mediante un espía de conexión ("sniffing"). Alguien que le espíe su conexión podrá ver todo su tráfico de datos, mirar las conversaciones privadas, coger las contraseñas (oper logins, nickserv, etc.). Por la misma razón use ssh en vez de telnet.
    -

    - -

    8.6 Ataques de Denegación de Servicio (DoS) [o: cómo proteger mi hub)
    -

    -Muchos de las redes han experimentado con ataques (D)DoS. Puede reducir su efecto tomando algunas medidas. Muchas de ellas tienen un servidor hub, al que siempre atacan.
    -Detalladamente: -
    -1. Ponga el nombre del servidor a un host que no exista ('hub.mi.red'), que no tenga subdominio. Así el atacante no podrá saber el host a atacar. Tan sólo tendrá que unir sus servidores al hub especificando la IP no pública.
    -    Ejemplo 1: link visibiblename.yournet.com { hostname 194.15.123.16; [etc] };.
    -    Ejemplo 2: link visibiblename.yournet.com { hostname thehostnamethatworks.yournet.com; [etc] };.
    -    Como nota, para el último ejemplo asegúrese que no permiten transferencia de zonas.
    -2. Otro punto importante es ocultar '/stats c' y otra información. De no ser así los atacantes tendrán a su disposición cuantiosa información de real valor. Si quiere despreocuparse por eso, use set { oper-onlye-stats "*"; }; para restringir este comando. Más información en el próximo apartado.
    -
    -Por supuesto estas medidas son menos efectivas si se hacen después de meses de haber empezado, porque la IP puede ser conocida por varios atacantes. Obviamente pueden atacar a servidores leaf, pero requiere más esfuerzo para tumbar la red que no atacando uno o dos puntos vitales.
    -

    - -

    8.7 Información descubierta
    -

    -STATS
    -El comando /stats proporciona numerosa información que posiblemente quiera restringir tanto como sea posible. Muchas de las redes prefieren que los usuarios no tengan acceso a este comando, otros prefieren ocultar '/stats g' o '/stats k'.
    -Es recomendable usar set { oper-only-stats "*"; };  para prohibir todos los /stat para usuarios no operadores. Por ejemplo:
    -- /stats o: da información sobre los operadores y sus hosts
    -- /stats c: da un aidea sobre las uniones entre servidores
    -- /stats g, /stats k: usado para banear proxis. Así el atacante puede tener una lista de proxis que puede usar
    -- /stats E, /stats e: información realmente importante
    -- /stats i, /stats y: puede permitir al atacante conocer muchos hosts de conexiones para atacar
    -- /stats P: muestra los puertos
    -etc etc...
    -
    -MAP / LINKS
    -Mucha gente ha preguntado si hay alguna forma de deshabilitar /map o /links. Pensamos que es absurdo hacerlo y que da una idea errónea sobre seguridad. Ocultar los servidores no es útil si los usuarios ya están dentro de ellos. Para los servidores a los que no quiere que conecten directamente, vea la sección 8.6.
    -Para ello puede usar la opción flat-map (set::options::flat-map) para mostrar los servidores directamente unidos en /map y /link pero sin saber dónde están conectado. Puede ser una medida más para prevenir los ataques a los puntos clave de la red. Obviamente si ocurre un split alguien podrá darse cuenta qué servidores están conectados entre sí.
    -
    -USUARIOS NORMALES Y SNOMASKS
    -Una característica no muy conocida es que los usuarios pueden ponerse snomasks limitados: sólo +s y +sk. Aun así pueden ver rehasehs, identificaciones de opers, kills y otros mensajes.
    -Para deshabilitarlo puede usar set::restrict-usermodes para usarlo con el modo s: set { restrict-usermodes "s";};.
    - - -

    -Por supuesto toda esta información oculta no es altamente segura, pero dificulta su ataque.
    -

    - -

    8.8 Protección contra agujeros explotables
    -

    -Existen varias actualizaciones para los sistemas operativos que hacen más difícil las vulnerabilidades del sistema. No suele ser lo más importante, pero es importante tenerlas al día por varias razones.
    -
    -Use siempre la última versión de UnrealIRCd. Subscríbase a unreal-notify mailinglist -para recibir las actualizaciones (unreal-notify es tan sólo para anuncios, 1 email cada X meses). Usualmente se explica detalladamente en el anuncio si contiene fallos de seguridad.
    -

    - -

    8.9 Sumario
    -

    -Tal y como podrá entender, nunca se puede estar 100% seguro. Sin embargo, entre todos podemos ayudar a reducir los ataques. Tómese su tiempo para montar su red y enseñar a sus operadores. Mucha gente no se preocupa de la seguridad y luego pasa lo que pasa. Trate de evitarlo.
    -

    - - -

    9 – Dudas más frecuentes (FAQ)

    -
    -

    Tiene una FAQ disponible en este enlace

    -
    -

    - - + + + +UnrealIRCd - 3.2 - Documentación oficial + + + + + + + +English | +German | +Spanish | +Hungarian | +French +

    +
    UnrealIRCd
    + http://www.unrealircd.com
    + Versión: 3.2.2
    + Versión actual : 3.2.2
    + Última actualización del documento: 2004-10-11
    +
    + Programadores: Stskeeps / codemastr / Syzop / Luke
    + Contribuciones: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
    + Documentación: CKnight^ / Syzop
    + Traducción al español: Trocotronic (irc.rallados.net)
    +

    Debido a la crecida de la complejidad de UnrealIRCd3.2, hemos cambiado una documentación más detallada para una más fácil navegación. Para ver esta documentación debe tener un navegador compatible. Tiene un listado debajo. Los documentos actualizados están disponibles en http://www.vulnscan.org/UnrealIrcd/unreal32docs.html + y una FAQ en http://www.vulnscan.org/UnrealIrcd/faq/. +

    +

    Navegadores compatibles:
    +

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

    +

    ÍNDICE / TABLA DE CONTENIDOS
    + 1. Introducción y notas
    + ---1.1. Notas al actualizar de 3.1.x a 3.2
    + ---1.2. Notas al actualizar entre versiones 3.2
    + 2. Instalación
    + 3. Características
    + -- 3.1. Cifrado
    + -- 3.2. Módulos
    + -- 3.3. Máscaras de usuario
    + -- 3.4. Aliases
    + -- 3.5. Helpop
    + -- 3.6. Niveles de acceso a operadores
    + -- 3.7. Comandos para operadores
    + -- 3.8. SSL
    + -- 3.9. IPv6
    + -- 3.10. Zip links
    + -- 3.11. Soporte conexión DNS/IP dinámico
    + -- 3.12. Características anti-flood
    + -- 3.13. Tipos de ban
    + -- 3.14. Filtro de spam
    + -- 3.15. CIDR
    + -- 3.16. Otras características
    + 4. Configurando su fichero unrealircd.conf
    + ---4.1. Explicación del archivo
    + ---4.2. Bloque me -=- (M:Line)
    + ---4.3. Bloque admin -=- (A:Line)
    + ---4.4. Bloque class -=- (Y:Line)
    + ---4.5. Bloque allow -=- (I:Line)
    + ---4.6. Bloque listen -=- (P:Line)
    + ---4.7. Bloque oper -=- (O:Line)
    + ---4.8. Bloque drpass -=-(X:Line)
    + ---4.9. Directriz include
    + ---4.10. Directriz loadmodule
    + ---4.11. Bloque log
    + ---4.12. Bloque TLD -=- (T:Line)
    + ---4.13. Bloque ban nick -=- (Q:Line)
    + ---4.14. Bloque ban user -=- (K:Line)
    + ---4.15. Bloque ban ip -=- (Z:Line)
    + ---4.16. Bloque ban server -=-(q:Line)
    + ---4.17. Bloque ban realname -=- (n:Line)
    + ---4.18. Bloque ban version
    + ---4.19. Bloque ban exception -=- (E:Line)
    + ---4.20. Bloque TKL exception
    + ---4.21. Bloque throttle exception
    + ---4.22. Bloque deny DCC -=- (dccdeny.conf)
    + ---4.23. Bloque deny version -=- (V:Line)
    + ---4.24. Bloque deny link -=- (D:Line / d:Line)
    + ---4.25. Bloque deny channel -=- (chrestrict.conf)
    + ---4.26. Bloque allow channel
    + ---4.27. Bloque allow DCC
    + ---4.28. Bloque vhost -=- (vhost.conf)
    + ---4.29. Bloque badword -=- (badwords.conf)
    + ---4.30. Bloque uline -=- (U:Line)
    + ---4.31. Bloque link -=- (C/N/H:Lines)
    + ---4.32. Bloque alias
    + ---4.33. Bloque help
    + ---4.34. Bloque official channels
    + ---4.35. Bloque spamfilter
    + ---4.36. Bloque set -=- (networks/unrealircd.conf)
    + 5. Archivos adicionales
    + 6. Modos de usuario y canal
    + 7. Comandos de usuario y operador
    + 8. Consejos de seguridad
    + ---8.1. Contraseñas
    + ---8.2. Vulnerabilidades no-IRCd
    + ---8.3. Permisos y archivo de configuración
    + ---8.4. Problemas de usuario
    + ---8.5. SSL/SSH y análisis de conexión
    + ---8.6. Ataques Denegación de Servicio (DoS) [o: cómo proteger mi hub]
    + ---8.7. Información descubierta
    + ---8.8. Protección contra agujeros explotables
    + ---8.9. Sumario
    + 9. Dudas más comunes (FAQ)
    +

    +

    1.0 – Introducción y notas
    +

    +

    Este documento se escribió exclusivamente para el uso con UnrealIRCd. El uso de este documento con otro programa + o la distribución de este documento con otro programa + está terminantemente prohibida sin los permisos de escritura del Equipo de Desarrollo de UnrealIRCd. + Este documento se puede copiar, imprimir, reproducir o publicar tantas veces se quiera, para el uso de UnrealIRCd y sin + modificación alguna. – Copyright UnrealIRCd Development Team 2002-2004

    +

    Por favor lea este manual antes de solicitar ayuda, el 80% de las dudas más frecuentes están en una + FAQ. Si todavía requiere ayuda, + puede encontrarla en irc.ircsystems.net (puerto 6667) canal #unreal-support (nota: + le pedimos que sean dudas relacionadas con UnrealIRCd, no con servicios). + Si ha encontrado un error (como un bloqueo del programa) notifíquelo en + http://bugs.unrealircd.org.

    +
    + +

    1.1 – Notas al actualizar de 3.1.x a 3.2
    +

    +
    +

    En el caso que esté actualizando desde Unreal3.1.x a Unreal3.2 apreciará que toda la configuración ha cambiado. + Lo encontrará difícil en un principio, pero una vez la haya cambiado encontrará que es mucho mejor.

    +

    No olvide leer la sección 3 sobre las características, todo y que conocerá algunas de 3.1.x existen cuantiosas mejoras.

    +

    No se recomienda unir servidores 3.1.x con 3.2. Aun así, si quiere hacerlo deberá ser a partir de la versión 3.1.4, pero se recomienda encarecidamente 3.1.5.1.

    +
    + +

    1.2 – Notas al actualizar entre versiones 3.2
    +

    +

    La mejor manera de actualizar es:
    +Linux:
    +

      +
    • Renombre su antiguo directorio UnrealIRCd (o deberá sobreescribirlo en el próximo paso) +
    • Extraiga la nueva versión y ejecute ./Config y make +
    • Copie sus antiguos archivos de configuración al nuevo directorio (unrealircd.conf, motd, rules, server.* [certificados SSL], archivo network, etc)

      +
    +Windows:
    +
      +
    • Copie todos sus archivos de configuración a un directorio temporal. +
    • Ejecute el desinstalador si tiene una versión antigua. +
    • Ejecute el instalador de la nueva versión. +
    • Copie todos sus archivos de configuración al nuevo directorio. +
    +

    Por favor lea .RELEASE.NOTES para saber los últimos cambios. + Si notifica algún cambio (o errores) entre versiones, hágalo después de haber leído el fichero.

    +
    + +

    2.0 - Instalación
    +

    +
    + Sistemas operativos soportados y testeados:
    +
      +
    • Versiones *NIX: +
        +
      • Linux 2.2.x +
      • Linux 2.4.x +
      • FreeBSD 4.6-STABLE +
      • FreeBSD 4.5-STABLE +
      • Solaris 2.x +
      +
    • Versiones Windows: +
        +
      • WindowsXP Home +
      • WindowsXP Pro +
      • Windows 2000 Pro +
      • Windows 2000 Server +
      • Windows 2000 Advanced Server +
      • Windows 98 +
      • Windows Me +
      +
    +
    + Si tiene Unreal3.2 trabajando correctamente en otros sistemas, + envíe los detalles a docs@unrealircd.com
    +

    +

    Instrucciones de instalación
    +Linux:
    +

      +
    1. gunzip -d Unreal3.2.2.tar.gz +
    2. tar xvf Unreal3.2.2.tar +
    3. cd Unreal3.2 +
    4. ./Config +
    5. Responda a las preguntas que se le formulen. Si no conoce alguna, utilice el valor por defecto. +
    6. make +
    7. Cree su archivo unrealircd.conf y otros archivos de configuración. Vea la sección 4. +
    +

    +Windows:
    +

      +
    1. Ejecute el instalador. +
    2. Cree su archivo unrealircd.conf y otros archivos de configuración. Vea la sección 4. +
    +

    +

    +

    3.0 - Características +

    +
    +

    Algunas de las características más relevantes se explican en esta sección. Da una idea general de su potencia + y a veces hace referencia al archivo de configuración (algo que quizás no conozca todavía).

    +

    Puede omitir esta sección, sin embargo es interesante leerla antes y despues de la instalación.

    +
    + +

    3.1 - Cifrado

    +
    +

    Las direcciones host de los usuarios se encriptan mediante un cifrado. Por ejemplo, si su host es d5142341.cable.wanadoo.nl, + se mostrará (en join, part, whois, etc) como rox-2DCA3201.cable.wanadoo.nl. + Esta medida es muy útil para prevenir ataques entre usuarios.

    +

    Está controlado por el modo de usuario +x (uso: /mode tunick +x). Los administradores pueden forzar el uso por defecto, o restringir su uso.

    +

    Un host cifrado está generado por un módulo (requerido). Actualmente existen dos módulos oficiales:
    + cloak: Este es el nuevo módulo de cifrado que es mucho más seguro que el viejo. Usa md5 internamente y requiere la especificación de tres claves set::cloak-keys:: alfanuméricas [ej: "AopAS6WQH2Os6hfosh4SFJHs"]. Mire el archivo example.conf para hacerse una idea.
    + oldcloak: Es el viejo cifrado usado por Unreal3.2 y anteriores. Sólo se recomienda su uso en procesos de migración y actualización. No se considera seguro (se le avisará de ello si lo usa) y deberá utilizar 'cloak' tan pronto como sus servidores puedan.

    +

    Las claves de cifrado (en adelante "cloak keys") deben ser las mismas en todos los servidores de la red. Procure que estas claves sean secretas. Si alguien las conociera, podría decodificar el host original, lo que provocaría la pérdida de efectividad del modo de usuario +x.

    +
    +

    3.2 - Módulos

    +
    +

    UnrealIRCd soporta módulos que aportan cuantiosas ventajas:
    + - Puede cargarlos, refrescarlos y descargarlos mientras tiene el servidor abierto (usando /rehash). Esto le permite corregir fallos o disponer de las nuevas mejoras de los módulos cargados y todo sin la necesidad de reiniciar.
    + - Otra gente puede crear nuevos módulos con nuevos comandos, modos de usuario e incluso modos de canales.
    + UnrealIRCd sólo se distribuye con unos pocos módulos. Visite www.unrealircd.com en módulos o use google para encontrar más.
    +

    Se necesita cargar almenos dos módulos:
    + - El módulo de comandos: commands.so (commands.dll en windows)
    + - El módulo de cifrado: generalmente cloak.so (cloak.dll en windows).

    +
    + +

    3.3 - Máscaras

    +
    +

    Las máscaras de usuario (conocidas como snomasks) son un tipo especial de modo de usuario que controla qué notificaciones del servidor quiere recibir (generalmente usado para operadores).

    +

    Se pueden usar mediante: /mode tu nick +s MÁSCARA. Por ejemplo:: /mode yournick +s +cF
    + Para quitar algunas máscaras, use algo como: /mode tunick +s -c, por ejemplo.
    + Puede quitarse todas las máscaras quitándose simplemente el modo s: /mode tunick -s

    +

    Se disponen de las siguientes máscaras:
    + c - conexiones locales
    + F - conexiones remotas (menos de servidores de servicios)
    + f - notificaciones de flood
    + k - notificaciones de desconexiones forzadas [*]
    + e - notificaciones de información
    + j - notificaciones de medidas
    + v - notificaciones de hosts virtuales
    + G - notificaciones de gline/shun
    + n - notificaciones de cambios de nicks locales
    + N - notificaciones de cambios de nicks remotos
    + q - notificaciones de denegación de nicksdeny nick (Q:line)
    + s - notificaciones del servidor [*]
    + S - notificaciones del filtro de spam
    + o - notificaciones de identificaciones de Operadores de red +
    + [*: disponible para usuarios no operadores]
    +

    +

    Puede controlar qué máscaras puede obtener (set::snomask-on-connect) y cuáles para operadores (set::snomask-on-oper, oper::snomask)

    +
    + +

    3.4 - Aliases

    +

    Con los aliases puede configurar comandos de usuario. Puede, por ejemplo, permitir "/ns identify blah" sea redirigido a nickserv (que se traduciría como: privmsg nickserv identify blah). Puede incluso hacer aliases más complejos como /register sea redirigido a chanserv si el primer parámetro empieza por # o a nickserv si no empieza.

    +

    Los aliases se configuran con los bloques alias en el archivo de configuración y puede incluír varios archivos en el mismo para la mayoría de servicios.

    +
    + +

    3.5 - Helpop

    +

    UnrealIRCd tiene un sistema accesible de ayuda usando /helpop. Este comando es completamente configurable vía el bloque help. Además, se incluye el archivo help.conf con algunas nociones básicas para todos los comandos soportados.
    + Por ejemplo, /helpop chmodes le muestra una lista de todos los modos de canal que tiene UnrealIRCd.
    + Recuerde que si es un operador (helpop) tiene que prefijar los mensajes con '?'. Así, /helpop es /helpop ? y /helpop chmodes es /helpop ?chmodes etc..

    +
    + +

    3.6 - Niveles de acceso a operadores

    +
    +

    Existen varios niveles de operadores en UnrealIRCd y puede utilizar privilegios adicionales (como el uso de /gline) para cada uno, según los que necesite el operador.

    +

    Se controla mediante opciones en el bloque oper. Vea el bloque oper para más información.

    +
    + +

    3.7 - Comandos para operadores

    +
    +

    UnrealIRCd tiene muchos comandos para operadores, explicados en Comandos de usuario y operadores.

    +
    + +

    3.8 - SSL

    +

    SSL se entiende por Secure Socket Layer. Con SSL puede hacer conexiones encriptadas de una forma segura. Puede usarse para encriptar conexiones servidor a servidor y de cliente a servidor. Usará SSL para proteger contra análisis y para una autentificación de la otra máquina.

    +

    Necesita tener compilado su servidor con soporte SSL. Además, necesitará disponer de un puerto SSL, configurable en listen::options::ssl.

    +

    No puede conectar normalmente a un puerto SSL. Así, no podrá usar el puerto 6667 para SSL. Además se requiere un cliente o una pasarela que entienda el protocolo SSL.

    +

    Clientes que soportan SSL: XChat, + irssi, + mIRC (6.14 y posteriores, + con pasos adicionales)

    +

    Para clientes que no soporten SSL puede usar una pasarela como stunnel. Aquí tiene un ejemplo (para stunnel 4.x):
    +

    +   client = yes
    +   [irc]
    +   accept = 127.0.0.1:6667
    +   connect = irc.myserv.com:6697
    +
    + Entonces, si conecta a 127.0.0.1 en el puerto 6667, su tráfico será encriptado y enviado a irc.myserv.com + en el puerto 6697 (puerto SSL). +

    +

    Probablemente necesitará validar certificados cuando conecte a un servidor y no los acepte a ciegas (como en el ejemplo anterior). Si no, será todavía vulnerable a ataques por análisis de conexión ("sniffing"). Sin embargo, es muy denso para explicar aquí (lea información sobre SSL, no nos pregunte). [mIRC y xchat muestran una ventana preguntando si aceptar o rechazar el certificado, eso es bueno].

    +
    +

    3.9 - IPv6

    +

    UnrealIRCd soporta IPv6. Desde la versión beta15 parece ser estable.
    + Su sistema opertivo necesita tener soporte IPv6 y tenerlo activado en UnrealIRCd en ./Config.
    +

    Aun así, microsoft ha añadido una implementación experimental para w2k/XP que no soporta UnrealIRCd (todavía).

    +
    + +

    3.10 - Zip links

    +

    Zip links se pueden utilizar para conexiones servidor a servidor, que comprime el tráfico usando zlib. Puede ahorrar un 60-80% del ancho de banda. Así pues, puede serle util para conexiones de baja capacidad o para conexiones con muchos usuarios.

    +

    Para compilar con soporte zip links necesita responder Yes a la pregunta zlib en ./Config configurar link::options::zip (en ambos servidores).

    +
    + +

    3.11 - Soporte conexión DNS/IP dinámico

    +
    +

    UnrealIRCd tiene algunas características (nuevas) que ayudan a usuarios con IP dinámicas a usar DNS dinámicos (como blah.dyndns.org). Si está conectando dos DNS dinámicos, entonces establezca link::options::nodnscache y link::options::nohostcheck. +

    +
    + +

    3.12 - Características anti-flood

    +
    +

    +Throttling
    +Throttling es un método que le permite fijar un límite de cuántas veces pueden los usuarios conectarse y desconectarse de su servidor. Puede configurarlo en el bloque set::throttle para permitir X conexiones en YY segundos para la misma IP.
    +Modos de canal
    +Existen varios modos de canal para prevenir ataques. Algunos son:
    +K = no /knock, N = no cambios de nick, C = no CTCPs, M = sólo usuarios reigstrados (+r) pueden hablar.
    +Desde la versión beta18 eixste el modo +f que es mucho más avanzado...
    +Modo de canal f
    +En vez de usar scripts y bots para proteger un canal contra floods ahora se incluye en el propio ircd.
    +Un ejemplo del modo +f es:*** Blah sets mode: +f [10j]:15
    +Significa que se permiten 10 joins cada 15 segundos. Si se supera este límite el servidor pondrá el modo +i automáticamente.
    +Aquí se detallan los tipos de flood: +
    + + + + + + + + + + + + + + + + + + +
    tipo:nombre:acción por defecto:otras acciones:comentarios
    cCTCPsauto +Cm, M 
    jjoinsauto +iR 
    kknocksauto +K para clientes locales
    mmessages/noticesauto +mM 
    nnickchangesauto +N  
    ttextkickbantiguo +f. Expulsará o baneará al usuario
    +

    +  Ejemplo: +

    +*** 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
    +
    + +De hecho, puede complicarse más:
    +En vez de usar la acción por defecto, puede especificar otras como por ejemplo: +f [20j#R,50m#M]:15
    +Esto pondrá el canal en +R si se sobrepasa el límite de 20 joins en 15 segundos y pondrá el modo +M si se superan los 50 mensajes en 15 segundos.
    +
    +Además, se puede especificar el tiempo de duración de este modo: +f [20j#R5]:15 pondrá el canal en +R si se sobrepasa el límite y lo quitará después de 5 minutos.
    +El servidor puede usar un tiempo para quitar los modos por defecto (set::modef-default-unsettime). Así, si usa+f [20j]:15 se pasa a +f [20j#i10]:15, que es por defecto, pero puede seguir usando[20j#i2]:15 y para no quitar nunca este modo +f [20j#i0]:15 (usando 0).
    +
    +El viejo modo +f todavía está disponible como 't', +f 10:6 pasa a ser +f [10t]:6 y +f *20:10 es +f [20t#b]:10. Actualmente el ircd convierte este cambio. Fíjese que no hay tiempo para quitar este modo ([20t#b30]:15 no funcionará).
    +
    +¿Cuál es la mejor combinación? No existe el modo +f perfecto para todos los canales, pero puede guiarse con el siguiente ejemplo para ajustarlos a sus necesidades:
    ++f [30j#i10,40m#m10,7c#C15,10n#N15,30k#K10]:15
    +30 joins en 15 segundos, si se supera el límite se pone el modo +i durante 10 minutos
    +40 mensajes en 15 segundos, si se supera el límite se pone el modo +m durante 10 minutos
    +7 ctcps en 15 segundos, si se supera el límite se pone el modo +C durante 15 minutos
    +10 cambios de nick en 15 segundos, si se supera el límite se pone el modo +N durante 15 minutos
    +30 knocks en 15 segundos, si se supera el límite se pone el modo +K durante 10 minutos
    +Especialmente, quitar los modos es importante. Imagínese un canal sin operadores, el modo estaría durante 15 minutos, en el que la gente no podría hablar, dependiendo del tipo de flood.
    + +

    3.13 - Tipos de ban

    +
    +

    +Tipos de ban básicos y hosts cifrados
    +UnrealIRCd soporta los bans básicos como +b nick!user@host.
    +Además, si un host cifrado como 'rox-ACB17294.isp.com' y pone un ban a *!*@rox-ACB17294.isp.com, +entonces si el usuario se pone -x (y su host es 'dial-123.isp.com') el ban continuará siendo vigente. Los bans se comprueban con los hosts virtuales y reales.
    +También se admiten bans a la IP (ej: *!*@128.*) y siempre se comprueba.
    +
    +Los bans a IPs cifradas requieren una atención especial: +
    +Si el usuario tiene la IP 1.2.3.4 y su host cifrado es 341C6CEC.8FC6128B.303AEBC6.IP, entonces:
    +Si pone +b *!*@341C6CEC.8FC6128B.303AEBC6.IP estará baneando*!*@1.2.3.4 (obviamente)
    +Si pone +b *!*@*.8FC6128B.303AEBC6.IP estará baneando a *!*@1.2.3.*
    +Si pone +b *!*@*.303AEBC6.IP estará baneando a *!*@1.2.*
    + Puede serle útil cuando decida poner un ban.
    +
    + Tipos de ban extendidos
    + Un ban extendido sigue este formato ~[!]<tipo>:<ban>. Se soportan los tipos:
    + + + + + + + + + + + + + + + + + + + +
    tipo:nombreexplicación
    ~qquietLos usuarios que coincidan con este ban no podrán hablar, a menos que tenga +v o superior. Ej: ~q:*!*@blah.blah.com
    ~nnickchangeLos usuarios que coincidan con este ban no podrán cambiarse el nick, + a menos que tenga +v o superior. Ej: ~n:*!*@*.aol.com
    ~cchannelSi el usuario está en ese canal no podrá entrar. +Ej: ~c:#lamers
    ~rrealnameSi su realname coincide no podrá entrar
    + Ej: ~r:*Stupid_bot_script*
    + NOTA: un guión bajo ('_') coincide con un espacio (' ') y un guión bajo. Será lo mismo + 'Stupid bot script v1.4'.
    +Estos bans también se soportan por la lista de excepciones (+e).
    +Los módulos pueden añadir otros tipos de ban. +
    +

    + +

    3.14 - Filtro de spam

    +
    +

    El filtro de spam es un nuevo sistema para luchar contra el spam, la publicidad, los guasnos y otras cosas. Trabaja como las badwords pero con algunas ventajas.

    +

    Los filtros spam se añaden vía /spamfilter que utiliza la sintaxis:
    + /spamfilter [add|del|remove|+|-] [tipo] [acción] [tkltiempo] [razón] [regex]
    + + + + + + + + + + + + + + + + + + + +
    [tipo] especifica el destino:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Char:Config item:Descripción:
    cchannelMensaje a canal
    pprivateMensaje privado (de usuario->usuario)
    nprivate-noticeAviso privado
    Nchannel-noticeAviso a canal
    PpartMensaje part
    qquitMensaje quit
    ddccArchivo DCC
    uuserUser ban, coincidirá con nick!user.@host:realname
    + Puede especificar varios destinos, por ejemplo: cpNn
    [accción] especifica una acción a tomar (sólo una)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    killdesconecta al usuario
    tempshunpone un shun a la sesión actual del usuario (si reconecta el shun se va)
    shunpone un shun al host
    klinepone una kline al host
    glinepone una gline al host
    zlinepone una zline al host
    gzlinepone una gzline al host
    blocksólo bloquea el mensaje
    dccblockmarca el usuario para no poder enviar más DCCs
    viruschanfuerza su salida de todos los canales, fuerza su entrada a set::spamfilter::virus-help-channel, desactiva todos los comandos menos PONG, ADMIN y mensajes a set::spamfilter::virus-help-channel
    [tkltiempo] Duración de la *line añadida por el filtro, use '-' para el valor por defecto o para saltarlo (ej: si la acción es 'block')
    [razón] Motivo de la *line. No puede usar espacios, pero los guiones bajos ('_') se transforman en espacios. Los guiones bajos dobles ('__') en simples ('_'). Use '-' para una razón por defecto.
    [regex] expresión regular que debe ser filtrada
    +
    + Por ejemplo: /spamfilter add pc gline - - Come watch me on my webcam
    + Si se encuentra el texto come watch me on my webcam en un privado o mensaje a canal entonces se bloquea el mensaje y se le pone una gline.
    + Otro ejemplo: /spamfilter add pc block - - come to irc\..+\..+
    + Es una expresión regular que concuerda con Hi, come to irc.blah.net etc.
    + Y un ejemplo especificando la razón y el tiempo::
    + /spamfilter add p gline 3h Please_go_to_www.viruscan.xx/nicepage/virus=blah Come watch me on my webcam
    + Si se encuentra come watch me on my webcam en un privado el usuario es glineado para tres horas con la razón Please go to www.viruscan.xx/nicepage/virus=blah.
    +
    + Los filtros de spam añadidos con /spamfilter son globales en la red. Trabajan pase lo que pase aunque el usuario tenga +G. Sólo los operadores y servicios de red están excemtos del filtrado. +

    Puede añadir filtros de spam en el archivo de configuración pero estos filtros serán locales. Su uso se describe en el bloque spamfilter here
    + Ejemplo:
    +

    spamfilter {
    +	regex "//write \$decode\(.+\|.+load -rs";
    +	target { private; channel; };
    +	reason "Generic $decode exploit";
    +	action block;
    +};

    +

    set::spamfilter::ban-time permite modificar el valor por defecto del tkltiempo (por defecto 1 día)
    + set::spamfilter::ban-reason permite especificar una razón por defecto (por defecto 'Spam/advertising')
    + set::spamfilter::virus-help-channel permite especificar un canal para forzar la entrada en la acción 'viruschan' (por defecto #help)
    + set::spamfilter::virus-help-channel-deny permite bloquear los joins normales al canal virus-help-channel (por defecto no)
    +

    + +

    3.15 - CIDR

    +

    UnrealIRCd dispone de soporte para CIDR (Classless Interdomain Routing). CIDR te permite banear rangos de IPs. Todas las IPs se localizan en los ISPs usando CIDR. Así pues, pudiendo banear fácilmente un ISP. Unreal soporta CIDR para IPv4 y IPv6. Las máscaras CIDR se pueden usar en allow::ip, ban user::mask, ban ip::mask, except ban::mask, except throttle::mask y except tkl::mask (para gzline, gline y shun). Además, se puede utilizar CIDR en /kline, /gline, /gzline, /zline y /sun. Se utiliza el estándar de IP/bits, por ejemplo, 12.0.0.0/8 (es 127.0.0.0 - 127.255.255.255) y fe80:0:0:123::/64 (es +fe80:0:0:123:0:0:0:0 - fe80:0:0:123:ffff:ffff:ffff:ffff).

    +
    + +

    3.16 - Otras características

    +
    +

    UnrealIRCd tiene muchísimas más características que no se detallan... Deberá encontrarlas por usted mismo.

    +
    + +

    +

    4.0 - Configurando su unrealircd.conf

    +
    +

    Antes de todo, crear un buen archivo unrealircd.conf puede tomarle algo de tiempo, probablemente entre 10 y 60 minutos. Puede intentar hacer uno rápido y mejorarlo más tarde, o puede aprender las secciones directamente paso a paso. Si tiene problemas, compruebe su sintaxis, compruebe el manual y la FAQ antes de preguntar o notificar un fallo.

    +
    +

    4.1 Archivo de configuración
    +

    +

    +

    El nuevo sistema está basado en bloques. Cada entrada, o bloque, tiene un formato concreto, parecido a:

    +
    +<nombre-bloque> <valor-bloque> {
    +	<directriz-bloque> <valor-directriz>;
    +};
    +

    +

    <nombre-bloque> es el tipo de bloque, como me o admin. <valor-bloque> a veces requiere un valor, como /oper login, pero la mayoría de veces será un sub-tipo como en ban user.

    +

    <directriz-bloque> es una variable individual del bloque, y <valor-directriz> es su valor asociado. Si <valor-directriz> + contiene espacios, o caracteres que representan un comentario, deberá entrecomillarlo. Si quiere usar una doble comilla, deberá escaparla \".

    +

    Un <bloque-directriz> puede tener varias directrices. Si es el caso, tendrá sus propias subsecciones. Algunos bloques sólo requieren un <valor-bloque>, como ocurre en include. Fíjese que no hay un formato fijado, significa que el bloque entero puede aparecer en una o varias líneas. El formato mencionado es el más utilizado (y el que se usará en adelante) porque facilita su lectura.

    +

    Nota: el archivo es sensible a mayúsculas/minúsculas. Es una notación especial usada para refererirse a las entradas. Por ejemplo, hablar de <nombre-directriz>, está diciendo <nombre-bloque>::<directriz-bloque>, y si la directriz tiene un subbloque, deberá añadir otros :: y el nombre de la subdirectriz.

    +

    Hablar sobre una directriz sin nombre deberá hacerlo con <nombre-bloque>:: que en este caso significa <valor-bloque>, o puede tener un subbloque sin nombre.

    +

    Se soportan tres tipos de comentario:

    +

    # Una sola línea
    + // Una sola línea
    + /* Varias
    +     líneas */
    +

    +

    Ahora que ya conoce como funciona, cree su archivo unrealircd.conf o cópielo de doc/example.conf y edítelo. Es recomendable ir paso a paso.

    +

    +

    4.2 - Bloque me + REQUERIDO (conocido como M:Line) +

    +

    +

    Sintaxis:
    +

    +me {
    +	name <nombre-del-servidor>;
    +	info <descripción-servidor>;
    +	numeric <numérico>;
    +};
    +

    +

    Estos valores se sobreentienden. name especifica el nombre del servidor, info su descripción y numeric el numérico con el que se identifica el servidor. Debe ser un valor entre 1 y 255 y debe ser único en la red. Otro servidor no podrá tener el mismo numérico.

    +

    Ejemplo:
    +

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

    +

    +

    4.3 - Bloque admin + REQUERIDO (conocido como A:Line) +

    +

    +

    Sintaxis:
    +

    +admin {
    +	<text-line>;
    +	<text-line>;
    +};
    +

    +

    +

    El bloque admin define el texto a mostrar en /admin. Puede especificar tantas líneas como quiera que contengan, pero se suele incluir el nick de los administradores y alguna dirección e-mail de referencia.

    +

    Ejemplo:
    +

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

    +

    +

    4.4 - Bloque class + REQUERIDO (conocido como Y:Line) +

    +

    +

    Sintaxis:
    +

    +class <nombre> {
    +	pingfreq <frecuencia-ping>;
    +	connfreq <frecuencia-connect>;
    +	maxclients <máximo-clientes>;
    +	sendq <cola-de-salida>;
    +	recvq <cola-de-llegada>;
    +};
    +
    +

    +

    +

    Este bloque contiene qué conexiones deben relacionarse. Generalmente tendrá varias clases, para servidores, clientes, operadores.

    +

    name es un nombre descriptivo de la clase, como "clients" o "servers", que se usará para la referencia

    +

    pingfreq es el número de segundos de PINGs entre servidores (se recomienda un valor entre 90 y 180)

    +

    connfreq se usa sólo para servidores y es el número de segundos para el intento de conexión si está activado autoconnect

    +

    maxclients especifica el número máximo de clientes o servidores que puede albergar la clase

    +

    sendq especifica la cantidad de tráfico que puede enviar (muy alto para servidores con poco ancho de banda y mediano para clientes)

    +

    recvq especifica la cantidad de tráfico que puede recibir y se usa para evitar flood (sólo se aplica en usuarios). Pruebe con valores entre 3000 y 8000, que es el valor por defecto

    +

    Ejemplos:
    +

    +class clients {
    +	pingfreq 90;
    +	maxclients 500;
    +	sendq 100000;
    +	recvq 8000;
    +};
    +
    +class servers {
    +	pingfreq 90;
    +	maxclients 10; /* máximo de servidores unidos al mismo tiempo */
    +	sendq 1000000;
    +	connfreq 100; /* segundos antes de cada intento de conexión */
    +};
    +
    +

    +

    +

    4.5 - Bloque allow + REQUERIDO (conocido como I:Line) +

    +

    +

    Sintaxis:
    +

    +allow {
    +	ip <user@máscara-ip>;
    +	hostname <user@máscara-host>;
    +	class <clase-de-conexión>;
    +	password <contraseña> { <tipo-identificación>; };
    +	maxperip <máximo-usuarios-por-misma-ip>;
    +	redirect-server <servidor-a-redirigir>;
    +	redirect-port <puerto-a-redirigir>;
    +	options {
    +		<opción>;
    +		<opción>;
    +		...
    +	};
    +};
    +
    +

    +

    Este bloque define quién puede conectar al servidor. Puede tener varios bloques allow.

    +

    Sobre la correspondencia
    + El control de acceso funciona con ip o hosts, así "hostname *@*;" y "ip *@1.2.3.4;" significa que siempre corresponderá. Además siempre tendrá preferencia el bloque que ponga después del bloque general *@*.  Si quiere relacionar un bloque por ip, entonces fije el hostname a algo inválido, como "hostname NOBODY;", para hacerlo sólo por ip.

    +

    ip
    + La máscara ip es de la forma user@ip, user es la ident, generalmente *, y la ip es la ip en cuestión. Ej: *@* (para todos), *@192.168.* (para direcciones que empiecen por 192.168), etc.

    +

    host
    + También user@host. user user generalmente se pone a *. Ej: *@* (todos), *@*.retevision.es (sólo para retevisión.es).

    +

    password (opcional)
    + Precisa una contraseña para conectar. Puede especificar el método de cifrado de la contraseña.

    +

    class
    + Especifica la clase a la que se relacionará la conexión.

    +

    maxperip (opcional, recomendado)
    + Le permite especificar cuántas conexiones simultáneas se permiten en el servidor.

    +

    redirect-server (opcional)
    + Si la clase está llena, a qué servidor redireccionar los clientes (si el cliente lo soporta [mIRC 6 lo hace]).

    +

    redirect-port (opcional)
    + Si se especifica redirect-server puede especificar el puerto, si no se asume 6667.

    +

    bloque options (opcional)
    + Opciones válidas:
    +   useip siempre usa la ip en vez del host
    +   noident no utiliza la ident especificada por el cliente
    +   ssl sólo relaciona si el cliente usa SSL
    +   nopasscont relaciona aunque no se especifique contraseña (así puede poner clientes en clases diferentes si dan o no dan contraseña) +

    Ejemplos:
    +

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

    +

     

    +

    4.6 - Bloque listen + REQUERIDO (conocido como P:Line) +

    +

    +

    Sintaxis:
    +

    +listen <ip:puerto> {
    +	options {
    +		<opción>;
    +		<opción>;
    +		...
    +	};
    +};
    +
    +

    +

    +

    Este bloque especifica qué puertos deberán escucharse. Si no se requieren opciones, deberá hacerlo sin directrices, con la forma <ip>:<puerto>;.

    +

    ip y puerto
    + Puedes fijar la ip a * para enlazar con todas las ips posibles, o especificar una ip a enlazar (usada en proveedores de shells). El puerto es el puerto que se va a escuchar. Puede especificar un rango. Por ejemplo, 6660-6669 escuchará los puertos desde 6660 hasta 6669, ambos incluídos. Para usuarios IPv6 vea a continuación.

    +

    Información para usuarios IPv6
    + Si tiene un servidor IPv6 necesitará englobar la IP entre llaves, com [::1]:6667 (escucha localhost en el puerto 6667). Si usa IPv6 y quiere escuchar una ip IPv4 necesitará usar ::ffff:ipv4ip. Por ejemplo, [::fff:203.123.67.1]:6667 pondrá en escucha el puerto 6667 de la ip 203.123.67.1. Obviamente puede usar *.

    +

    bloque options (opcional)
    + Puede especificar opciones adicionales:
    + + + + + + + + + + + + + +
    clientsonly
    puerto exclusivo para clientes
    serversonly
    puerto exclusivo para servidores
    java
    soporte CR javachat
    ssl
    puerto SSL
    +

    + +

    Ejemplos:

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

    +

    O si no hay opciones:

    +

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

    +

    4.7 - Bloque oper + RECOMENDADO (conocido comoO:Line) +

    +

    +

    Sintaxis:
    +
    oper <nombre> {
    +	from {
    +		userhost <hostmask>;
    +		userhost <hostmask>;
    +	};
    +	password <contraseña> { <auth-type>; };
    +	class <clasee>;
    +	flags <flags>;
    +	flags {
    +		<flag>;
    +		<flag>;
    +		...
    +	};
    +	swhois <información whois>;
    +	snomask <snomask>;
    +	maxlogins <num>;
    +modes <modos>;
    +};
    +
    +

    El bloque oper permite asignar Operadores de Red para tu servidor. oper:: especifica el nombre de usuario para /oper. oper::from::userhost es una máscara user@host que debe coincidir. Puede especificar más de una máscara usando varios oper::from::userhost. oper::password es la contraseña que deberá especificar, oper::password:: permite especificar un método de cifrado para esta contraseña. Métodos válidos: crypt, md5, sha1 y ripemd-160. Si no utilizará método de cifrado, este bloque puede omitirse.

    +

    Note que es sensible a maýusculas y minúsculas.

    +

    La directriz oper::class especifica el nombre de una clase preexistente (que aparezca antes del archivo) y es a la que relacionará el operador.

    +

    La directriz oper::flags tiene dos formatos. Si quiere usar el antiguo sistema (ej: OAa) deberá usar flags <flags>; si quiere usar el nuevo estilo, flags { <flag>; }. A continuación se detallan los flags soportados:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Antiguo
    Nuevo
    Descripción
    o
    local
    Le hace operador local
    O
    global
    Le hace operador global
    C
    coadmin
    Le hace coadmin
    A
    admin
    Le hace admin
    a
    services-admin
    Le hace admin de servicios
    N
    netadmin
    Le hace administrador de red
    r
    can_rehash
    Puede usar /rehash
    D
    can_die
    Puede usar /die
    R
    can_restart
    Puede usar /restart
    h
    helpop
    Recibe modo +h (helpop)
    w
    can_wallops
    Puede usar /wallops
    g
    can_globops
    Puede usar /globops
    c
    can_localroute
    Puede conectar servidores localmente
    L
    can_globalroute
    Puede conectar servidores remotamente
    k
    can_localkill
    Puede usar /kill en usuarios locales
    K
    can_globalkill
    Puede usar /kill en usuarios remotos
    b
    can_kline
    Puede usar /kline
    B
    can_unkline
    Puede usar /kline -user@host
    n
    can_localnotice
    Puede enviar notificaciones locales
    G
    can_globalnotice
    Puede enviar notificaciones globales
    z
    can_zline
    Puede usar /zline
    t
    can_gkline
    Puede usar /gline, /shun y /spamfilter
    Z
    can_gzline
    Puede usar /gzline
    W
    get_umodew
    Recibe modo +W
    H
    get_host
    Fija su host de operador
    v
    can_override
    Puede usar OperOverride
    q
    can_setq
    Puede usar el modo de usuario +q
    X
    can_addline
    Puede usar /addline
    d
    can_dccdeny
    Puede usar /dccdeny y /undccdeny
    +

    Algunos flags se incluyen al recibirse:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    localglobaladmin/coadminservices-adminnetadmin
    can_rehashcan_rehashcan_rehashcan_rehashcan_rehash
    helpophelpophelpophelpophelpop
    can_globopscan_globopscan_globopscan_globopscan_globops
    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
    +

    La directriz oper::swhois añade una línea adicional a su whois. [opcional]

    +

    La directriz oper::snomask fija las máscaras de servidor que recibirá. Vea la sección 3.3 + [opcional]

    +

    La directriz oper::maxlogins restringe el número de intentos para hacerse operador. Si lo fija a 1, sólo podrá haber un operador usando este bloque al mismo tiempo [opcional]

    +

    La directriz oper::modes establece qué modos recibe el operador cuando se identifica. [opcional]

    +

    Ejemplo:
    +

    +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 "Example of a whois mask";
    +	snomask frebWqFv;
    +};
    +
    +

    +Un poco sobre OperOverride:
    +OperOverride tiene aspectos como entrar en canales con +ikl, saltarse bans (deberá usar /invite antes), opearse en el canal, etc.
    +El operflag can_override fue añadido para evitar este abuso. No está por defecto, deberá especificarlo expresamente para cada operador. +

    +

    4.8 - Bloque drpass + RECOMENDADO (conocido como X:Line) +

    +

    Sintaxis:
    +

    +drpass {
    +	restart <contraseña-reinicio> { <auth-type>; };
    +	die <contraseña-fin> { <auth-type>; };
    +};
    +

    +

    Este bloque fija las contraseñas para /restart y /die con drpass::restart y drpass::die respectivamente. Las directrices drpass::restart:: y drpass::die:: permiten especificar un método de cifrado de contraseñas. Los métodos soportados son crypt, md5, sha1 y ripemd-160.

    +

    Eejemplo:

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

    +

    +

    4.9 - Directriz include +

    +

    +

    Sintaxis:
    + include <archivo>;

    +

    Especifica el archivo a cargar como archivo de configuración. Puede contener configuraciones de bloques e incluso contener otros archivos. Se permite el uso de comodines en el nombre del archivo para cargar varios archivos a la vez.

    +

    ejemplo 1: un archivo de red
    +

    include mynetwork.network;

    +

    Usará un archivo de red por separado, aunque ya no se necesitan; toda la configuración de red puede insertarse directamente en el archivo unrealircd.conf.

    +

    ejemplo 2: aliases
    +

    include aliases/ircservices.conf

    +

    Otro ejemplo para incluir aliases. UnrealIRCd viene con varios archivos que contienen aliases para la mayoría de servicios:
    +

      +
    • 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 - Directriz loadmoule + REQUERIDO +

    +

    +

    Sintaxis:
    + loadmodule <archivo>;

    +

    Vea aquí por qué son útiles.

    +

    Los módulos que vienen de serie con Unreal3.2:

    +

    commands.so / commands.dll - Todos los comandos (casi todos) REQUERIDO
    + cloak.so / cloak.dll - Módulo de cifrado REQUERIDO (u otro módulo de cifrado)

    +

    Cerciórese de cargar estos dos módulos

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

    o en windows:

    +
    +loadmodule "modules/commands.dll";
    +loadmodule "modules/cloak.dll";
    +
    +
    +

    4.11 - Bloque log + OPCIONAL +

    +

    +

    Sintaxis:
    +

    +log <archivo> {
    +	maxsize <tamaño-máximo>;
    +	flags {
    +		<flag>;
    +		<flag>;
    +		...
    +	};
    +};
    +
    +

    +

    Este bloque permite loguear varios eventos: log:: contiene el nombre del archivo. log::maxsize es opcional y permite especificar el tamaño máximo que puede tener el archivo. Puede entrar este valor usando MB para megabytes, KB para kilobytes y GB para gigabytes. log::flags especifica qué tipo de información va a loguearse. Estos eventos se detallan a continuación.

    +

    Puede especificar varios bloques para loguear varios eventos en distintos archivos.

    +

    Flags disponibles :
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errorsloguea errores
    killsloguea /kill
    tklloguea información de *lines, shuns y spamfilters
    connectsloguea conexiones/desconexiones de usuarios
    server-connectsloguea conexiones/desconexiones de servidores
    klineloguea el uso /kline
    operintento de oper
    sadmin-commandsloguea el uso de los comandos /sa* (samode, sajoin, sapart, etc.)
    chg-commandsloguea el uso de los comandos /chg* (chghost, chgname, chgident, etc.)
    oper-overrideloguea el uso de operoverride
    spamfilterloguea las coincidencias de spam
    +

    + +

    Ejemplo:

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

    +

    +

    4.12 - Bloque TLD + OPCIONAL (conocido como T:Line) +

    +

    +

    Sintaxis:
    +

    +tld {
    +	mask <hostmask>;
    +	motd <archivo-motd>;
    +	rules <archivo-reglas>;
    +	shortmotd <archivo-shortmotd>;
    +	channel <nombre-canal>;
    +	options {
    +		ssl;
    +	}
    +};
    +

    +

    Este bloque le permite especificar motd, rules y canales para usuarios en función de su host. Es útil para tener varios motds en distintos lenguajes. tld::mask es una máscara user@host que coincide con la máscara del usuario. tld::motd, tld::shortmotd, y tld::rules especifican el motd, shortmod y archivo de reglas espectivamente para mostrar en función del host. tld::shortmotd es opcional. tld::channel es opcional y permite especificar un canal al que el usuario será forzado cuando conecte. Si existe, omitirá el canal por defecto en autojoin. El bloque tld::options le permite definir parámetros adicionales. Sólo existen tld::options::ssl para clientes SSL y tld::options::remote para clientes remotos.

    +

    Las entradas TLD se relacionan de arriba abajo.

    +

    Ejemplo:
    +

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

    +

    +

    4.13 - Bloque ban nick OPCIONAL (conocido como Q:Line) +

    +

    +

    Sintaxis:
    +

    +ban nick {
    + mask <nickname>; + reason <razón>; +};
    +

    +

    Este bloque permite deshabilitar el uso de ciertos nicks en su servidor. ban::mask acepta comodines para relacionar varios nicks. ban::reason permite especificar la razón de esta prohibición. Generalmente se usa para los servicios de red.

    +

    Ejemplo:
    +

    +ban nick {
    +	mask "*C*h*a*n*S*e*r*v*";
    +	reason "Reservado para servicios";
    +};
    +

    +

    +

    4.14 - Bloque ban user + OPCIONAL (conocido como K:Line) +

    +

    +

    Sintaxis:
    +

    +ban user {
    +	mask <hostmask>;
    +	reason <razón>;
    +};
    +

    +

    Este bloque permite banear una máscara user@host para que no pueda conectar al servidor. ban::mask es una cadena con comodines. ban::reason es la razón de este bloqueo. Note que sólo es un ban local: el usuario podrá conectar a otro servidor.

    +

    Ejemplo:
    +

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

    +

    +

    4.15 - Bloque ban ip + OPCIONAL (conocido como Z:Line) +

    +

    +

    Sintaxis:
    +

    +ban ip {
    +	mask <ipmask>;
    +	reason <razónn>;
    +};
    +

    +

    Este bloque prohibe que determinadas IPs lleguen a conectar al servidor. Incluye tanto a servidores como clientes. ban::mask es una IP que puede contener comodines. ban::reason es la razón de este bloqueo.

    +

    Ejemplo:
    +

    +ban ip {
    +	mask 192.168.1.*;
    +	reason "Coge una ip real lamer";
    +};
    +

    +

    +

    4.16 - Bloque ban server + OPCIONAL (conocido como q:Line) +

    +

    +

    Sintaxis:
    +

    +ban server {
    +	mask <server-name>;
    +	reason <razón>;
    +};
    +

    +

    Este bloque tiene la característica de prohibir la unión de un servidor a la red. Si el servidor se une directamente a su servidor, esta unión se deniega. Si el servidor conecta a uno remoto, el servidor local lo desconectará de la red. ban::mask puede contener comodines y es el nombre del servidor que quiere prohibir. ban::reason es la razón de este bloqueo.

    +

    Ejemplo:
    +

    +ban server {
    +	mask broken.server.my.network.com;
    +	reason "Está cerrado";
    +};
    +

    +

    +

    4.17 - Bloque ban realname + OPCIONAL (conocido como n:Line) +

    +

    +

    Sintaxis:
    +

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

    +

    Este bloque permite banear a clientes en función de su GECOS (realname). Es muy útil para evitar flood de clones, según algunos bots con el mismo realname. ban::mask especifica el nombre a banear y puede contener comodines. ban::reason especifica la razón de este bloqueo.

    +

    Ejemplo:
    +

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

    +

    +

    4.18 - Bloque ban version + OPCIONAL +

    +

    +

    Sintaxis:
    +

    +ban version {
    +	mask <máscara-versión>;
    +	reason <razón>;
    +	action [kill|tempshun|shun|kline|zline|gline|gzline];
    +};
    +

    +

    Este bloque permite banear el uso de un determinado cliente en función de su programa mediante la respuesta CTCP version. Si el usuario no responde, el ban no prosigue. Es recomendable para evitar scripts maliciosos. ban::mask especifica la versión y puede contener comodines. ban::reason especifica la razón del bloqueo. Puede especificar también ban::action para tomar una medida, kill se usa por defecto. tempshun pondrá un shun a esa conexión. shun/kline/zline/gline/gzline lo harán a la ip (*@ip), la duración se configura en set::ban-version-tkl-time cuyo valor por defecto es de 1 día.

    +

    Ejemplo:
    +

    +ban version {
    +	mask "*SomeLameScript*";
    +	reason "SomeLameScript contiene una puerta trasera";
    +};
    +
    +ban version {
    +	mask "*w00tZombie*";
    +	reason "En ocasiones veo muertos";
    +	action zline;
    +};
    +

    +

    +

    4.19 - Bloque except ban + OPCIONAL (conocido como E:Line) +

    +

    +

    Sintaxis:
    +

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

    +

    Este bloque permitirá al host especificado saltarse los bans. Es útil cuando se banea a todo un proveedor o ISP y quiere permitir la entrada de alguien en concreto. La directriz except::mask especifica la máscara del cliente user@host a permitir.

    +

    Ejemplo:
    +

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

    +

    +

    4.20 - Bloque except tkl OPCIONAL +

    +

    +

    Sintaxis:
    +

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

    +

    Este bloque permite a un usuario saltarse los bloqueos tkl puestos a su host. Es muy útil cuando se banea a todo un proveedor o ISP y quiere permitir a alguien en concreto. La directriz except::mask especifica la máscara user@host a permitir. except::type especifica el tipo de ban a saltarse. Tipos válidos: gline, gzline, qline, gqline y shun, para Glines, Global Zlines, Qlines, Global Qlines y shuns, respectivamente. +Si se usa el formato type { }, se pueden especificar varios tipos a la vez.

    +

    Ejemplo:
    +

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

    +

    +

    4.21 - Bloque except throttle + OPCIONAL +

    +
    +

    Sintaxis:
    +

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

    +

    Este bloque especifica qué ips se saltarán la protección throttle. Sólo funciona si ha escogido throttle. except::mask especifica la ip a la que no se le aplicará el throttle.

    +

    Ejemplo
    +

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

    +

    +

    4.22 - Bloque deny dcc + OPCIONAL (conocido como dccdeny.conf) +

    +
    +

    Sintaxis:
    +

    +deny dcc {
    +	filename <archivo-a-bloquear>;
    +	reason <razón>;
    +	soft [yes|no];
    +};
    +

    +

    Este bloque permite especificar qué archivos no se pueden enviar vía DCC a través del servidor. Es muy útil para evitar la propagación de virus y troyanos.

    +

    El parámetro deny::filename especifica el archivo en cuestión y puede contener comodines. deny::reason especifica la razón del bloqueo.

    +

    Existe la opción deny::soft que si está fijada a 'yes' el dcc es bloqueado hasta que el usuario lo permite mediante /dccallow +nick. Vea dccallow.conf para más ejemplos.

    +

    Ejemplo:
    +

    +deny dcc {
    +	filename virus.exe;
    +	reason "Virus GD";
    +};
    +
    +deny dcc {
    +	filename "*.exe";
    +	reason "Contenido ejecutable";
    +	soft yes;
    +};
    +

    +

    +

    4.23 - Bloque deny version + OPCIONAL (conocido como V:Line) +

    +

    +

    Sintaxis:
    +

    +deny version {
    +	mask <nombre-servidor>;
    +	version <versión>;
    +	flags <flags-compilación>;
    +};
    +

    +

    Este bloque permite parar la unión de un servidor a la red en función de su versión y sus modos de compilación. El formato de este bloque es algo complicado pero no es muy difícil imaginarselo. La directriz deny::mask especifica una máscara con comodines del servidor al que se le aplica. deny::version especifica el número de protocolo que se refiere.

    +

    Por ejemplo, 3.0 es 2301, 3.1.1/3.1.2 es 2302, 3.2 es 2303. El primer caracter de este parámetro puede ser >, <, = o !. Si es >, todas las versiones superiores a esta son bloqueadas; con < todo lo contrario; con =, sólo esa versión y con ! todas las versiones menos esta. La directriz deny::Flags permite especificar qué modos de compilación debe o no debe tener. Estos modos se ponen uno detrás de otro y si cada modo es prefijado por ! significa que no debe tenerlo.

    +

    +

    4.24 - Bloque deny link + OPCIONAL (conocido como D/d:Line) +

    +

    +

    Sintaxis:
    +

    +deny link {
    +	mask <nombre-servidor>;
    +	rule <expresión-crule>;
    +	type <tipo>;
    +};
    +

    +

    Este bloque permite especificar reglas para denegar la unión de servidores. La directriz deny::mask especifica el nombre de servidor con comodines al que aplicar esta regla. La directriz deny::rule es bastante compleja. Una expresión crule le permite controlar detalladamente y es algo parecido a una expresión de programación. Se soportan cuantro operadores: connected(<servermask>) devuelve true si el servidor conectado coincide, directcon(<servermask>) devuelve true si el servidor está conectado directamente a su servidor, via(<viamask>,<servermask>) devuelve true si el servidor servermask está conectado conectado a viamask y directop() devuelve true si el operador que se usa con /connect está conectado directamente a este servidor. Estos operadores pueden combinarse usando && (y), || (o) y englobados entre llaves. Además, un operador precedido por ! comprueba si devuelve false. Si la expresión entera devuelve true, entonces se deniega el link. deny::type acepta dos valores: auto (sólo para autoconnects, pero /connect seguirá funcionando) y all (aplicado a todos los intentos).

    +

    +

    4.25 - Bloque deny channel OPCIONAL (conocido como chrestrict.conf) +

    +
    +

    Sintaxis::
    +

    +deny channel {
    +	channel "<máscara-canal>";
    +	reason <razón>;
    +	redirect "<nombre-canal>";
    +	warn [on|off];
    +};
    +

    +

    +

    Este bloque deshabilita la entrada a ciertos canales. La directriz deny::channel especifica los nombres de canales, con comodines, a los que los usuarios no pueden entrar. deny::reason, la razón por qué no pueden hacerlo. Además, puede especificar deny::redirect para redirigir a los usuarios a este canal. deny::warn si está en on enviará un notice a los operadores (con la snomask 'e') si algún usuario intenta entrar.

    +

    Ejemplo:

    +
    +deny channel {
    +	channel "#unrealsucks";
    +	reason "Tu si que apestas!";
    +};
    +
    +deny channel {
    +	channel "#*teen*sex*";
    +	reason "Estás salido";
    +	warn on;
    +};
    +
    +deny channel {
    +	channel "#operhelp";
    +	reason "Nuestro canal de ayuda es #help, no #operhelp";
    +	redirect "#help";
    +};
    +

    + +

    +

    4.26 - Bloque allow channel + OPCIONAL +

    +
    +

    Sintaxis:
    +

    +allow channel {
    +	channel "<máscara-canal>";
    +};
    +

    +

    Este bloque especifica los canales a los que los usuarios deben entrar.

    +

    Ejemplo:
    +

    +allow channel {
    +	channel "#algo";
    +};
    +

    +

    +

    4.27 - Bloque allow dcc + OPCIONAL +

    +
    +

    Sinaxis:
    +

    +allow dcc {
    +	filename "<máscara-archivo>";
    +	soft [yes|no];
    +};
    +

    +

    Este bloque permite establecer archivos que puedan ser enviados. Si allow dcc::soft está en 'yes' se aplica a la lista 'soft dcc bans', si está en 'no' se aplica a la lista normal ('hard').

    +

    Ejemplo:
    +

    +allow dcc {
    +	filename "*.jpg"; /* las imágenes son seguras */
    +	soft yes;
    +};
    +

    +

    +

    4.28 - Bloque vhost + OPCIONAL (conocido como vhosts.conf) +

    +
    +

    Sintaxis:
    +

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

    +

    Este bloque permite usar el comando /vhost para obtener un host virtual. El parámetro vhost::vhost puede ser user@host o simplemente el host que el usuario recibirá. vhost::from::userhost contiene las máscaras user@host que deben coincidir para recibir el host virtual. Puedes especificar más de una. vhost::login es el login que utilizará y vhost::password la contraseña. vhost::password:: acepta métodos de cifrado de contraseña como crypt, md5, sha y ripemd-160. vhost::swhois añade una línea extra a su whois.

    +

    Ejemplo:
    +

    +vhost {
    +	vhost my.own.personal.vhost.com;
    +	from {
    +		userhost my@isp.com;
    +		userhost myother@isp.com;
    +	};
    +	login mynick;
    +	password mypassword;
    +	swhois "Soy la monda";
    +};
    +

    +

    +

    4.29 - Bloque badword + OPCIONAL (conocido como badwords.*.conf) +

    +
    +

    Sintaxis:
    +

    +badword <tipo> {
    +	word <texto>;
    +	replace <palabra-reemplazar>;
    +	action <replace|block>;
    +};
    +

    +

    Este bloque permite gestionar la lista de palabras para canales y usuarios con modo +G de "badwords".  badword:: especifica el tipo: channel, message, quit y all. badword::word puede ser una simple palabra o una compleja expresión regular, según lo que necesite. badword::replace es una cadena por la que se reemplazará si coincide. Si se deja en blanco, se reemplazará por "<censored>". badword::action define la acción a tomar: si es replace la reemplazará y si es block bloqueará el mensaje entero. Si se deja en blanco, se asume replace.

    +

    Ejemplo:
    +

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

    +

    +

    4.30 - Bloque ulines + OPCIONAL (conocido como U:Line) +

    +

    +

    Sintaxis: +

    +ulines {
    +	<nombre-servidor>;
    +	<nombre-servidor>;
    +	...
    +};
    +

    +

    Este bloque define ciertos servidores para que tengan habilidades extras. Es recomendable únicamente para servidores de servicios y estadísticas, nunca para servidores normales. Cada entrada es el nombre del servidor.

    +

    Ejemplo:
    +

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

    +

    +

    4.31 - Bloque link + OPCIONAL (conocido como C/N/H:Lines) +

    +
    +

    Sintaxis:
    +

    +link <nombre-servidor> {
    +	username <usermask>;
    +	hostname <ipmask>;
    +	bind-ip <ip-a-enlazar>;
    +	port <puerto-a-conectar>;
    +	password-connect <contraseña-de-conexión-local>;
    +	password-receive <contraseña-de-conexión-remotas> { <auth-type>; };
    +	hub <hub-mask>;
    +	leaf <leaf-mask>;
    +	leafdepth <profundidad>;
    +	class <clase>;
    +ciphers <ssl-ciphers>;
    +	options {
    +		<opción>;
    +		<opción>;
    +		...
    +	};
    +};
    +

    +

    Este bloque es necesario para unir servidores. Tómese su tiempo para leerlo todo porque es bastante complicado y con lo que los usuarios tienen más errores.

    +

    Primero de todo, server-name es el nombre del servidor remoto, al que quiere unir.

    +

    username
    + Puedes especificarlo si tiene una autentificación ident. Normalmente pondrá "*".

    +

    hostname
    + El host o la IP del servidor remoto. Es usado por ambos lados al conectar y en la verificación del servidor que se une. Algunos ejemplos:
    + + + + + + + + + + + + + +
    1.2.3.4 IP normal
    hub.blah.com host: sólo para conexiones salientes, nunca para entrantes a menos que link::options::nohostcheck esté presente
    * no podrá conectar a * pero sí recibir la conexión
    ::ffff:1.2.3.4 unión de ipv6 a ipv4
    +

    +

    bind-ip (opcional)
    + Puede usarse para enlazar con una ip (ej: 192.168.0.1), nunca suele usarse.

    +

    port
    + Puerto a conectar (en el servidor remoto).

    +

    password-connect
    + Es la contraseña para conectar al servidor remoto. Debe ser texto plano.

    +

    password-receive
    + Es la contraseña para validar uniones entrantes y puede ser encriptada (métodos crypt, md5, sha1 y ripemd-160). Puede dejarlo como texto plano. Generalmente es el mismo que la contraseña anterior.

    +

    hub vs leaf
    + Un hub es un servidor con varios servidores unidos a él. Un leaf sólo tiene una unión, a su servidor. Un servidor o es un hub o un leaf, nunca ambos.

    +

    hub (opcional)
    + Este valor es la máscara de los servidores a los que puede conectar (ej: *.mi.red).

    +

    leaf (opcional)
    + Este valor es la máscara que este servidor actuará como leaf.towards. +

    +

    leaf-depth (opcional)
    + Si se especifica, la directriz leaf también debe especificarse. Este valor es la profundidad o número de uniones que puede tener.

    +

    class
    + Es la clase a la se relacionará este servidor, generalmente la clase server.

    +

    compression-level (opcional)
    + Especifica el nivel de compresión (1-9) si se especifica el parámetro link::options::zip.

    +

    ciphers (opcional)
    + Especifica los "ciphers" ssl para este enlace. Para obtener una lista de los "ciphers" disponibles, use el comando 'openssl ciphers. Deben especificarse separados por ':'.

    +

    bloque options
    + Algunas de las opciones son:
    + + + + + + + + + + + + + + + + + + + +
    ssl si conecta a un puerto SSL
    autoconnect su servidor intentará conectar automáticamente. El tiempo usado entre intentos es el que especificó en class::connfreq (se recomienda para un sólo lado, de leaf a hub)
    zip si quiere usar compresión, ambos servidores deben soportarla
    nodnscache no guarda la IP saliente. Úselo si tiene un host dinámico (como dyndns.org)
    nohostcheck no valida el host remoto (link::hostname). Úselo si tiene un host dinámico (como dyndns.org)
    quarantine los operadores mantendrán el estado de locales, no globales
    +

    +

    Ejemplo:

    +
    +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.32 - Bloque alias + OPCIONAL +

    +
    +

    Sintaxis [alias estándar]:
    +

    +alias <nombre> {
    + target <destino>;
    +	type <tipo>;
    +};
    +

    +

    (Nota: puede ver más archivos de alias estándars que lleva UnrealIRCd en este enlace)

    +

    Este bloque (estándar) le permite redireccionar comandos a usuarios, generlamente a bots como por ejemplo /chanserv para enviarle privados. alias:: especifica el nombre del comando, por ejemplo chanserv. alias::target el nick o canal al que se le enviará el mensaje y puede omitirse. alias::type define el tipo de alias: services (el usuario está en el servidor de servicios), stats (en el de estadísticas), normal (en un servidor normal) y channel (el target es un canal). Este bloque tiene otro propósito detallado a continuación.

    +

    Sintaxis [alias de comandos]:
    +

    +alias <nombre> {
    +	format <expresión-regular> {
    +		target <destino>;
    +		type <tipo>;
    +		parameters <parámetros-del-mensaje>;
    +	};
    +	format <expresión-regular> {
    +		...
    +	};
    +	type command;
    +};
    +

    +

    Este uso es más extenso y tiene más posibilidades. Por ejemplo, puede crear aliases como /identify. alias:: es el mismo que el anterior: el nombre del comando. alias::format especifica la expresión regular que debe coincidir con el texto enviado. Si lo hace, se usan las subentradas. Así puede tener varios alias::format para seguir distintas acciones según la coincidencia, a partir de sus subentradas. alias::format::target es el nick o canal de destino. alias::format::type es el tipo de alias. alias::format::parameters es lo que se enviará como parámetro al alias. Para especificar un parámetro que se enviará al nick, use % seguido del número de parámetro. Por ejemplo, %1 enviará el primer parámetro. Para especificar todos los parámetros a partir de uno, use %n- donde n es el número de parámetro. Por ejemplo, %2- enviaría todos los parámetros a partir del segundo, incluído. Además, puede usarse %n para que sea reemplazado por el nick que ejecuta el comando. Para más información consulte doc/example.conf.

    +

    +

    4.33 - Bloque help + OPCIONAL +

    +
    +

    Sintaxis:
    +

    +help <nombre> {
    +	<línea>;
    +	<línea>;
    +	...
    +};
    +

    +

    (Nota: use generalmente help.conf)

    +

    Este bloque le permite crear entradas para /helpop. help:: es el valor que se pasará a /helpop como parámetro. Si se omite, se usará si no se envían parámetros a /helpop. Las entradas serán las que se mostrarán al usuario cuando lo solicite.

    +

    + +

    4.34 - Bloque official-channels + OPCIONAL +

    +
    +

    Sintaxis:
    +

    +official-channels {
    +	"#canal" { topic "El topic por defecto"; };
    +};
    +

    +

    Estos canales se muestran en /list, aunque no haya usuarios. topic es opcional y sólo se muestra si tiene 0 usuarios.

    + +

    Ejemplo:
    +

    +official-channels {
    +	"#Help" { topic "Canal oficial de ayuda. Si nadie está presente, use /helpop ayuda"; };
    +	"#Home";
    +	"#Main" { topic "Canal principal"; };
    +};
    +

    +
    + +

    4.35 - Bloque spamfilter + OPCIONAL +

    +
    +

    +Este bloque le permite añadir filtros de spam locales.
    +Vea las características del filtro de spam para más información.
    +

    +

    Sintaxis:
    +

    +spamfilter {
    +	regex <palabra>;
    +	target { <target(s)> };
    +	action <acción>;
    +	reason <razón>;
    +	ban-time <tiempo>;
    +};
    +

    +

    regex es la expresión regular a comparar.
    + target especifica los destinos, vea aquí para los tipos posibles (ej: 'channel').
    + action define la acción a tomar, vea aquí para las acciones posibles (ej: 'gline').
    + reason opcional: especifica la razón.
    + ban-time opcional: especifica la durada de la *line..
    +

    + +

    Ejemplos:
    +

    +spamfilter {
    +	regex "Come watch me on my webcam";
    +	target { private; channel; };
    +	action gline;
    +	reason "You are infected, please go to www.antivirus.xx/blah/virus=GrrTrojan";
    +	ban-time 6h;
    +};
    +
    +spamfilter {
    +	regex "come to irc\..+\..+";
    +	target { private; channel; };
    +	action gline;
    +	action gline;
    +	reason "No spamming allowed";
    +};
    +

    +
    + +

    4.36 - Bloque set + REQUERIDO (conocido como archivo unrealircd.conf/networks) +

    +
    +

    Este bloque se usa para configurar la red. Si sólo tiene un servidor, puede meterlo todo en el archivo unrealircd.conf. Si tiene varios, se recomienda ponerlo por separado.

    +

    Si su servidor está en una red, puede poner la configuración de red en un archivo aparte y cargarlo con include en cada servidor.

    +

    En este documento, la configuración y directrices están de forma <nombre-bloque>::<nombre-directriz>. Este formato no debe usarse en el archivo, debe convertirse al formato detallado a continuación. Es una representación para simplificar su lectura.

    +

    Sintaxis:
    +

    +set {
    +	<entrada> <valor>;
    +	<entrada> <valor>;
    +	...
    +};
    +

    +

    Este bloque fija las opciones para cada servidor. Cada entrada tiene su propósito que se explica a continuación. Algunas directrices tienen subbloques que también se detallan. Hay varios puntos a prestar atención. Todas las directrices y parámetros deben estar dentro de tan sólo un bloque set. Si una directriz tiene varias opciones, deben incluirse dentro del bloque set.
    + Ejemplo:
    +

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

    +

    Si quiere poner algunos bloques por separado, debe hacerlo en una sóla línea.
    + Ejemplo:
    + set { options { hide-ulines; no-stealth; }; };
    +

    +

    set::kline-address <direción-email>;
    + La dirección email para cualquier referencia. Valor obligado.

    +

    set::modes-on-connect <+modos>;
    + Los modos que se pondrán al usuario al conectar.

    +

    set::snomask-on-connect <+modos>
    + La máscara de noticias que se pondrán al usuario al conectar.

    +

    set::modes-on-oper <+modos>;
    + Los modos que recibirán los operadores cuando hagan /oper.

    +

    set::snomask-on-oper <+modos>;
    + La máscara de noticias que recibirán los operadores.

    +

    set::modes-on-join <+modos>;
    + Los modos que se pondrán a un canal cuando sea creado. No se pueden usar los modos +qaohvbeOAzlLk.

    +

    set::restrict-usermodes <modos>
    + Modos a restringir (no use + o -).
    + Por ejemplo puede usar +G en modes-on-connect y G en restrict-usermodes para que no puedan quitarse este modo.

    +

    set::restrict-channelmodes <modos>
    + Modos a restringir en canales (no use + o -).
    + Por ejemplo puede usar +G en modes-on-join y G en restrict-channelmodes para que no puedan quitar este modo.
    + NOTA: es posible usar esta característica con la opción MLOCK de los servicios si se diera el caso. Sin embargo no podemos dar soporte a eso.

    +

    set::restrict-extendedbans <tipos|*>
    + No se permite el uso de bans extendidos ("*") o algunos en concreto (ej: "qc").

    +

    set::auto-join <canaless>;
    + Los canales a los que se forzará el usuario a entrar. Para especificar varios, use la coma.
    + [Nota: no olvide entrecomillarlo, como auto-join "#chan";]

    +

    set::oper-auto-join <canales>;
    + Los canales a los que se forzará el operador entrar. Para especificar varios, use la coma.
    +[Nota: no olvide entrecomillarlo, como auto-join "#chan";]

    +

    set::anti-spam-quit-message-time <tiempo>;
    + Tiempo que debe transcurrir entre /quit para que el mensaje sea mostrado. Úselo para prevenir el abuso de publicidad. Si el valor es una cadena alfanumérica, use d para días, h para horas, m para minutos y s para segundos. Por ejemplo 1d2h3m significa 1 día, 2 horas y 3 minutos.

    +

    set::prefix-quit <prefijo>;
    + Prefijo que se usará para preceder los mensajes en desconexiones voluntarias. Si se pone a 0 se usa "Quit:".

    +

    set::static-quit <mensaje quit >;
    + Fija un mensaje permanente en desconexiones. Sea cual sea el mensaje del usuario siempre se mostrará este. Elimina la necesidad de usar anti-spam-quit-message-time, como también prefix-quit. No reemplaza errores con el mensaje static-quit.

    +

    set::static-part <no|yes|mensaje part>;
    + Si se usa 'yes' se quitan todos los mensajes part. Con 'no' no modifica nada. Cualquier otro valor se usará como comentario. Puede ser algo confuso, úselo con determinación.

    +

    set::who-limit <límite>;
    + Límite de entradas a mostrar en /who. Si se omite, no hay límite.

    +

    set::silence-limit <límite>;
    + Límite de entradas en la lista silence. Si se omite, el límite es de 15.

    +

    set::oper-only-stats <lista-stats>;
    + Lista de stats que sólo los operadores pueden usar en /stats. Omítalo para permitir a los usuarios ver toda la información o "*" para restringirla toda a operadores. Sólo se aceptan las stats en forma corta.

    +

    set::oper-only-stats {<stats-flag>; <stats-flag>;};
    + El caso anterior pero con stats en forma larga.

    +

    set::maxchannelsperuser <nº-canales>;
    + Límite de canales que pueden entrar los usuarios al mismo tiempo.

    +

    set::maxdccallow <nº-entradas>;
    + Límite de entradas en la lista dccallow.

    +

    set::channel-command-prefix <prefijo>;
    + Especifica el prefijo para mostrar el mensaje a los usuarios que estén con +d. Suele usarse para bots. Si se omite, el prefijo es "`".

    +

    set::allow-userhost-change [never|always|not-on-channels|force-rejoin]
    + Especifica qué hacer cuando el user@host cambia (+x/-x/chghost/chgident/setident/vhost/etc.).
    + never deshabilita todos los comandos, always los permite aunque estén en canales (causa desincronización) [por defecto], not-on-channels si el usuario no está en ningún canal, force-rejoin forzará al usuario a reentrar en los canales y se le dará op/voz, etc. si fuera necesario.

    +

    set::options::hide-ulines;
    + Si está presente, los servidores u-line no se muestran en /links si lo solicita un usuario no operador.

    +

    set::options::flat-map;
    + Si está presente, los servidores aparecerán directamente unidos en /map y /links, sin saber a qué servidor están unidos. Es una pequeña ayuda para evitar ataques (D)DoS a los servidores importantes o puntos vitales de la red.

    +

    set::options::show-opermotd;
    + Si está presente, se mostrará el opermotd cuando hagan /oper con éxito.

    +

    set::options::identd-check;
    + Si está presente, se comprobará el servidor ident y devolverá el valor del username. Si no devuelve nada o no existe servidor ident, el username se prefijará con ~. Si se omite, no se hace la comprobación.

    +

    set::options::show-connect-info;
    + Si está presente, se muestran los mensajes "ident request", "hostname lookup", etc. cuando el usuario conecte.

    +

    set::options::dont-resolve;
    + Si está presente, no se resolverán los hosts. Puede ser útil para acelerar la conexión.
    + Note que si no se usa, el bloque allow deberá basarse en ips, no en hosts.

    +

    set::options::mkpasswd-for-everyone;
    + Todos los usuarios pueden usar /mkpasswd.

    +

    set::options::allow-part-if-shunned;
    + Permite usar /part a los usuarios con shun.

    +

    set::dns::timeout <timevalue>;
    + Tiempo de espera del servidor DNS si no obtiene respuesta. Si el valor es una cadena alfanumérica, use d para días, h para horas, m para minutos y s para segundos. Por ejemplo 1d2h3m significa 1 día, 2 horas y 3 minutos.

    +

    set::dns::retries <nº-intentos>;
    + Número de intentos si el servidor DNS no obtiene respuesta.

    +

    set::dns::nameserver <name-of-dns-server>;
    + Especifica el host del servidor a usar en las búsquedas DNS.

    +

    set::network-name <nombre-de-red>;
    + Fija el nombre de la red. Debe ser el mismo en todos los servidores.

    +

    set::default-server <nombre-servidor>;
    + Define el servidor por defecto a conectar si la clase está llena.

    +

    set::services-server <nombre-servidor>;
    + Especifica el nombre del servidor de los servicios. Requerido. Use un valor aleatorio como servicios.mi.red si no dispone de ellos.

    +

    set::stats-server <nombre-servidor>;
    + Especifica el nombre del servidor de estádisticas. Si no dispone de ellas, puede omitir este valor.

    +

    set::help-channel <canal-ayuda>;
    + Canal de ayuda.

    +

    set::cloak-keys { "clave1"; "clave2"; "clave3"; };
    + Fija las claves de cifrado para generar los hosts virtuales. Deben ser las mismas en toda la red. Deben ser cadenas de 5 a 100 caracteres (con 10-20 es suficiente) alfanuméricas: a-z, A-Z y 0-9. Según el módulo de cifrado cargado, usará otras reglas.

    +

    set::hiddenhost-prefix <prefijo>;
    + Define el prefijo del host virtual. Suele ser un reflejo del nombre de la red.

    +

    set::hosts::local <vhost-locop>;
    + Define el host que se les asignará a los operadores locales si llevan +x. Puede especificar un user@host para este campo.

    +

    set::hosts::global <vhost-globop>;
    + Define el host que se les asignará a los operadores globales si llevan +x. Puede especificar un user@host para este campo.

    +

    set::hosts::coadmin <vhost-coadmin>;
    + Define el host que se les asignará a los co-admin si llevan +x. Puede especificar un user@host para este campo.

    +

    set::hosts::admin <vhost-admin>;
    + Define el host que se les asignará a los administradores si llevan +x. Puede especificar un user@host para este campo.

    +

    set::hosts::servicesadmin <vhost-admin-servicios>;
    + Define el host que se les asignará a los administradores de servicios si llevan +x. Puede especificar un user@host para este campo.

    +

    set::hosts::netadmin <vhost-admin-red>;
    + Define el host que se les asignará a los administradores de red si llevan +x. Puede especificar un user@host para este campo.

    +

    set::hosts::host-on-oper-up <yes/no>;
    + Si está en 'yes', recibirán el host automáticamente acompañado del modo +x si no lo tuvieran. Si no, deberán ponerse el modo +x manualmente.

    +

    set::ssl::egd <archivo>;
    + Especifica el archivo EGD (Entropy Gathering Daemon) para SSL. Si usa OpenSSL 0.9.7 o mayor, entonces se buscan por defecto las rutas /var/run/egd-pool, /dev/egd-pool, /etc/egd-pool, + y /etc/entropy y no es necesario especificarlo, simplemente dejándolo en blanco (set::ssl::edg).

    +

    set::ssl::certificate <archivo>;
    + Especifica la ubicación del archivo de certificado SSL.

    +

    set::ssl::key <archivo>;
    + Especifica la ubicación del archivo de llave privada SSL.

    +

    set::ssl::trusted-ca-file <filename>;
    + Especifica la ubicación del archivo de los CAs permitidos.

    +

    set::ssl::options::fail-if-no-clientcert;
    + Sólo acepta clientes con certificado.

    +

    set::ssl::options::no-self-signed;
    + Sólo acepta clientes con un certificado no propio.

    +

    set::ssl::options::verify-certificate;
    + Verifica la autenticidad del certificado SSL antes de la conexión.

    +

    set::throttle::period <tiempo>
    + Tiempo que debe esperar el usuario para volver a conectar si rebasa el número de intentos de conexión.

    +

    set::throttle::connections <nº>;
    + Número de veces que puede conectar con el mismo host sin que se le haga throttle.

    +

    set::ident::connect-timeout <segundos>;
    + Número de segundos que debe esperar a obtener respuesta del servidor ident. (por defecto: 10s).

    +

    set::ident::read-timeout <segundos>;
    + Número de segundos que debe esperar respuesta (por defecto: 30s).

    +

    set::anti-flood::unknown-flood-bantime <tiempo>;
    + Especifica el tiempo que debe estar bloqueado una conexión desconocida por flood.

    +

    set::anti-flood::unknown-flood-amount <kbs>;
    + Especifica la cantidad de tráfico (en kilobytes) que una conexión desconocida puede enviar antes de ser desconectada.

    +

    set::anti-flood::away-flood <veces>:<periodo>
    + Protección flood por away: límita el número de veces que puede usarse /away dentro de un periodo de segundos. Requiere tener activado NO_FLOOD_AWAY en config.h. Por ejemplo: away-flood 5:60s; significa podrán usar /away un máximo de 5 veces cada 60 segundos.

    +

    set::anti-flood::nick-flood <veces>:<periodo>
    + Protección flood por nick: límita el número de veces que se pueden cambiar el nick dentro de un periodo de segundos. Por ejemplo: nick-flood 4:90; significa que sólo podrán cambiarse el nick 4 veces cada 90 segundos. Por defecto: 3 cada 60s.

    +

    set::default-bantime <tiempo>
    + Tiempo por defecto en comandos como /kline, /gline, /zline, /shun, etc. sin parámetro. Por defecto es permanente (0).

    +

    set::modef-default-unsettime <valor>
    + Tiempo por defecto para quitar un modo que se ponga debido al efecto de +f. Por ejemplo: si especifica 10, se transformarán a +f [5j#i10]:15. Por defecto no hay tiempo para quitar el modo.

    +

    set::modef-max-unsettime <valor>
    + Máximo de minutos que pueden especificar en el modo +f (+f [5j#i<TIEMPO>]:15). Debe ser un valor entre 0 y 255. Por defecto 60 (1 hora).

    +

    set::ban-version-tkl-time <valor>
    + Especifica cuánto debe durar una acción como zline/gline/etc en ban version. Por defecto 86400 (1 día).

    +

    set::spamfilter::ban-time <valor>
    + Similar a la directriz anterior pero para filtros de spam.

    +

    set::spamfilter::ban-reason <razón>
    + Razón por defecto en los filtros de spam.

    +

    set::spamfilter::virus-help-channel <canal>
    + Canal usado para la acción viruschan en los filtros de spam.

    +

    set::spamfilter::virus-help-channel-deny <yes|no>
    + Si está en 'yes' (o '1') sólo los usuarios invitados por el filtro de spam pueden entrar en ese canal, a excepción de los operadores.

    +

    set::spamfilter::except <target(s)>
    + Estos "target(s)" se omiten del filtro de spam (no se toma ninguna acción). Puede especificar varios separándolos con comas. Ej: except "#help,#spamreport";.

    +
    +

    5 – Archivos adicionales +

    +
    + Además de los archivos de configuración, Unreal tiene varios archivos como MOTD, OperMOTD, BotMOTD y Rules. Vea los usos que tiene cada uno.
    + Note que los archivos motd (todos los tipos) y rules pueden especificarse en el bloque tld. Sólo son los archivos por defecto (y para MOTD/RULE's remotos). +

      + + + + + + + + + + + + + + + + + + + + + +
    ircd.motdSe muestra cuando se usa /motd y (si ircd.smotd no está presente) cuando el cliente conecta
    ircd.smotdSe muestra al conectar solamente (short MOTD, motd corto)
    ircd.rulesSe muestra cuando se usa /rules
    oper.motdSe muestra cuando se usa /opermotd o cuando se identifican como operadores
    bot.motdSe muestr cuando se usa /botmotd
    +

    +

    6 – Modos de usuario y canal +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Modo
    Descripcción
    Channel Modes
    A
    Sólo pueden entrar administradores
    a <nick>
    Hace de nick administrador del canal
    b <nick!user@host>
    +
    Pone un ban
    c
    No se pueden enviar colores ANSI
    C
    No se permiten CTCP's
    e <nick!user@host>
    Exception ban – si alguien coincide, siempre podrá entrar al canal aunque esté baneado
    f * <líneas:segundos>
    Protección flood. Si se especifica * el usuario será baneado y expulsado si envía más de líneas en menos de segundos. Si no se usa *, sólo se expulsa
    G
    Marca el canal con la lista de "badwords"
    M
    Sólo pueden hablar los usuarios registrados (+r)
    h <nick>
    Da el estado de semi operador del canal a nick
    i
    Se precisa invitación
    K
    No se permite /knock
    k <clave>
    Se precisa clave para entrar
    l <##>
    Fija el número máximo de usuarios que puede haber en el canal
    L <#canal>
    Si se pasa el límite del +l, los usuarios son enviados directamente a este canal
    m
    Canal moderado: sólo +v y superiores pueden hablar
    N
    No se permiten cambios de nick en el canal
    n
    No se permiten mensajes externos
    O
    Sólo operadores pueden entrar
    o <nick>
    Da el estado de operador del canal a nick
    p
    Marca el canal como privado
    q <nick>
    Marca nick como fundador del canal
    Q
    Sólo los servidores uline pueden expulsar a los usuarios
    R
    Sólo pueden entrar usuarios registrados (+r)
    S
    Quita todos los colores
    s
    Hace el canal secreto
    t
    Sólo halfops y superiores pueden cambiar el tema del canal
    T
    No se permiten notices al canal
    u
    Auditorium – Sólo se muestran los operadores del canal en /names o /who #canal
    V
    No se permite /invite
    v <nick>
    Da voz a los usuarios (pueden hablar en canales +m)
    z
    Sólo pueden entrar usuarios conectados bajo SSL
    +

     

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Modo
    Descripción
    Modos de usuario
    r
    Identifica al nick como registrado
    s
    Puede escuchar las notificaciones del servidor
    v
    Rechaza los DCC infectados automáticamente
    o
    Operador de red global
    O
    Operador de red local
    B
    Es un bot
    i
    Invisible (no se muestra en /who)
    A
    Administrador de servidor
    x
    Da al usuario un host virtual
    q
    Sólo ulines pueden expulsarle (sólo administradores de servicios)
    a
    Administrador de servicios
    g
    Puede leer y escribir globops y locops
    H
    Oculta el estado de operador de red
    S
    Protege a los servicios de red
    t
    Nota que el usuario usa un host virtual
    C
    Co administrador
    d
    No recibe mensajes de canal
    N
    Administrador de Red
    w
    Puede recibir wallops
    h
    Disponible para ayuda (HelpOp)
    G
    Filtra las palabras con la lista "badwords"
    W
    Le permite ver cuando le hacen /whois
    p
    Oculta sus canales de /whois
    R
    Le permite recibir mensajes de usuarios registrados (+r)
    V
    Usuario WebTV
    z
    Cliente SSL
    T
    Le previene de recibir CTCPs
    +

    +

    7 – Tabla de comandos para usuarios y operadores

    +
    +

    NOTA: /helpop muestra información más actualizada. Use /helpop comando (o /helpop ?comando si es operador) para obtener más información sobre ese comando.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Comando
    Descripcción
    Quién
    nick <nuevo_nick>Cambia tu nick. Alerta de ello a los demás usuarios.
    Todos
    whois <nick>Muestra información sobre el nick. Incluye el nombre completo, host, canales en los que está y el estado de operador, entre otros
    Todos
    who <patrón>Le permite buscar usuarios. El patrón incluye: nick, #canal, host (*.attbi.com)
    Todos
    whowas <nick> [max_respuestas]Muestra información sobre un nick desconectado. Puedes especificar un max_respuestas como máximo de entradas mostradas
    Todos
    ison <nick1 nick2 nick3 ...>Le permite comprobar si están conectados ciertos usuarios. Usado generalmente por scripts
    Todos
    join <canal1,canal2, ...>Le permite unirse en varios canales. Si usa /join 0 sale de todosTodos
    cycle <canal1,canal2, ...>Reentra de los canales especificados. Es equivalente a usar PART y luego JOINTodos
    motd [servidor]Muestra el motd del servidor. Añadiendo un servidor, muestra el motd de ese servidor
    Todos
    rules [servidor] Muestra las reglas del servidor. Añadiendo un servidor, muestra las reglas de ese servidorTodos
    lusers [servidor] Muestra los usuarios actuales y el número máximo de usuarios en la red, globales y locales. Añadiendo un servidor, muestra los usuarios de ese servidor
    Todos
    mapMuestra el mapa de la red Todos
    quit [razón] Le desconecta del servidor. Si incluye una razón, se mostrará en los canales en los que estéTodos
    ping <usuario> Envía una petición PING a un usuario. Se usa para medir el lag. Entre servidores, se usa para verificar que todavía sigue conectado
    Todos
    version <nick>Envía un CTCP version a un usuario. Si pertoca, el cliente responderá a ella
    Todos
    linksMuestra una lista de los servidores de la redTodos
    admin [servidor] Muestra la información de contacto del servidor. Si se añade un servidor, muestra la información de ese servidor
    Todos
    userhost <nick>Muestra el userhost del nick dado. Generalmente se usa en scripts
    Todos
    topic <canal> [tema]Topic <canal> muestra el tema del canal. Topic <canal> <mensaje> fija como tema del canal ese mensaje
    Todos
    invite <nick> <canal>Invita a este nick a un canal (debe ser operador del canal)
    Op Canal
    kick <canal,canal> <user, user> [razón]Expulsa a un o varios usuarios de un canal o varios canales. Puede incluir un motivo
    Op Canal
    away <razón>Le marca como ausente. Puede incluir una razón
    Todos
    Watch +-<nick> +-<nick>
    Watch es un sistema de notificaciones en UnrealIRCd, siendo más rápido ya que usa menos recursos de red que el viejo sistema. El servidor le envía un mensaje cuando un usuario de su lista watch se desconecta o se conecta. Esta lista no se conserva a cada sesión (su cliente o script deberá enviarla cada vez que se conecte)Todos
    helpop ?<tema> or !<tema>
    HelpOp es un nuevo sistema de ayuda. Puede usar /helpop ? <tema> o /helpop ! <tema>. Si usa "?" busca la ayuda en el propio programa. Si no obtiene ayuda, use "!" para mandarlo a los operadores de red. Si no usa ni "?" ni "!" primero consulta en la ayuda interna y si no la encuentra la manda a los operadoresTodos
    list <patrón> + Si no incluye un patrón, se le manda la lista de canales sin filtrar. El patrón acepta estas opciones:
    + >n Lista los canales con más de n personas
    + <n Lista los canales con menos de n personas
    + C>n Lista los canales creados entre ahora y hace n minutos
    + C<n Lista los canales creados antes de hace n minutos
    + T>n Lista los canales cuyos topics son mas antiguos que n minutos (que no han cambiados hace n minutos)
    + T<n Lista los canales cuyos topics son mas nuevo que hace n minutos
    + *máscara* Lista los canales que concuerdan con *máscara*
    + !*máscara* Lista los canales que no concuerdan con *máscara*
    Todos
    Knock <canal> <mensajee>
    Le permite hacer 'knock' en un canal para invitados preguntando por su invitación. No funcionará si el canal está en +V y +K, o si está baneado
    Todo
    setnameLe permite cambiar su nombre completo sin necesidad de reconectar
    Todos
    vhost <login> <contraseña>Oculta su host usando un host virtual proporcionado por el servidor
    Todos
    mode <canal/nick> <modo>
    Le permite cambiar los modos de un canal o sus propios modos. Vea Modos de usuario y canales para más información
    Todos
    creditsMuestra los créditos de la gente que ha ayudado a crear UnrealIRCd
    Todos
    licenseMuestra la licencia GNU Todos
    time [servidor] Muestra la fecha y la hora del servidor. Si añade un servidor, lo hace de ese servidor
    Todos
    botmotd [servidor]
    Muestra el mensaje para bots del servidor. Si añade un servidor, muestra el de ese servidor Todos
    identify <contraseña> Envía su contraseña a los servicios para identificarse como dueño de su nick
    Todos
    identify <canal> <contraseña>Envía su contraseña a los servicios para identificarse como fundador del canal Todos
    dns <opción>Devuelve información sobre el caché DNS de los servidores. Muchos clientes llevan este comando incluído, por ello se recomienda usar /raw DNS. Los operadores pueden especificar una l en el primer parámetro para recibir la lista de entradas DNSTodos
    oper <userid> <contraseña>
    Comando para identificarse como operador de red
    IRCop
    wallops <mensaje>Envía un mensaje a los usuarios con +wIRCop
    globops <mensaje>Envía un mensaje a todos los IRCops IRCop
    chatops <mensaje>Envía un mensaje a todos los IRCops con +cIRCop
    locops <mensaje>Envía un mensaje a todos los IRCops locales IRCop
    adchat <mensaje>Envía un mensaje a todos los Administradores IRCop
    nachat <mensaje>Envía un mensaje a todos los Administradores de Red IRCop
    kill <nick> <razón>Desconecta a un usuario de la red IRCop
    kline [+|-]<user@host | nick> [<duración> <razón>]Banea la máscara host del servidor. Una kline no es un ban global, tan sólo local.
    + duración es: a) un valor en segundos, b) un valor de tiempo como '1d' es un día o c) '0' par que sea permanente. La duración y razón son opcionales. Si no se especifican se toman los valores de set::default-bantime y razón como 'no reason'
    + Para quitar una kline use /kline -user@host
    IRCop
    zline [+|-]<*@ip> [<duración> <razón>]Banea una dirección IP del servidor local. Vea kline para más información. Use /zline -*@ip para quitarlaIRCop
    gline [+|-]<user@host | nick> [<duración> <razón>]
    Añade un ban global. Vea kline para más información. Use /gline -user@host para quitarla
    IRCop
    shun [+|-]<user@host | nick> [<duración> <razón>]
    Previene de que un usuario ejecute cualquier comando. Son globales. Vea kline para más información. Use /shun -user@host para quitarlo
    IRCop
    gzline [+|-]<ip> [<duración> <razón>]
    Añade una zline global. Vea kline para más información. Use /gzline -*@ip para quitarla
    IRCop
    rehash <servidor> –<opciones>Refresca los archivos de configuración de los servidores. Añadiendo un servidor, lo hará en ese servidor. Puede pasarle varias opciones:
    + -motd - Sólo refresca todos los motd y rules (incluyendo el bloque tld)
    + -opermotd - Sólo el archivo opermotd
    + -botmotd - Sólo el archivo botmotd
    + -garbage - Fuerza un garbage collection
    +
    IRCop
    restart <servidor <contraseña>
    Reinicia el servidor. Se requiere una contraseña. Puede especificar qué servidor quiere reiniciar
    IRCop
    die <contraseña>
    Cierra el servidor. Requiere contraseñaIRCop
    lag <servidor>
    Este comando actúa como un trazado. Puede escribir /lag servidor y todos los servidores por los que pase este comando le responderán. Así verá qué puntos de la red hay más lagIRCop
    sethost <nuevohost>Le permite cambiar su host al que quiera
    IRCop
    setident <nuevaident>
    Le permite cambiar su ident a la que quiera IRCop
    chghost <nick> <nuevohost>
    Cambia el host de un usuario IRCop
    chgident <nick> <nuevaident>
    Cambia la ident de un usuario IRCop
    chgname <nick> <nuevonombre>
    Cambia el nombre de un usuarioIRCop
    squit <servidor>
    Desconecta a un servidor de la red IRCop
    connect <servidor> [[<puerto>] <servidor>]Si sólo se da un servidor, intentará conectar a ese servidor. Si especifica dos servidores, intentará conectarlos entre sí. Ponga primero el leaf y luego el hub
    IRCop
    dccdeny <archivo> <razón>
    Prohibe el envío de un archivo o de archivos que coincidan con este
    IRCop
    undccdeny <archivo>
    Quita una entrada anterior IRCop
    sajoin <nick> <canal>, <canal>
    Fuerza a un usuario a entrar en estos canales IRCop
    sapart <nick> <canal>, <canal>
    Fuerza a un usuario a salir de estos canales IRCop
    samode <canal> <modos>
    Permite a los Administradores de Red y Servicios cambiar los modos de un canal
    IRCop
    rping <servidor>
    Calcula en milisegundos el lag entre servidores
    IRCop
    trace <servidor|nick>
    Devuelve la clase y el lag. Si lo usa sobre un servidor, le devuelve la clase y versión
    IRCop
    opermotd
    Le muestra el opermotd
    IRCop
    addmotd :<texto>
    Añade el texto al final del motd
    IRCop
    addomotd :<texto>
    Añade el texto al final del opermotd
    IRCop
    sdesc <descripción>
    Introduce una nueva descripción del servidor sin reiniciar
    IRCop
    addline <texto>
    Le permite añadir líneas al archivo unrealircd.conf
    IRCop
    mkpasswd <contraseña>
    Encripta un texto para añadirlo en unrealircd.conf
    IRCop
    tsctl offset +/- <tiempo>
    Ajusta el reloj interno del IRCD (no lo use si no sabe lo qué es)
    IRCop
    tsctl time
    Le da el tiempo TS IRCop
    tsctl alltimeLe da el tiempo TS de todos los servidores IRCop
    tsctl svstime <timestamp>
    Fija el tiempo TS en todos los servidores (no lo use si no sabe lo qué es)
    IRCop
    htm <opción>
    Controla el tráfico. En modo HTM básicamente deshabilita el uso de comandos como list, whois o who, puesto que ocupan mucho ancho de banda. Opciones:
    + -ON Servidor en HTM
    + -OFF Servidor fuera de HTM
    + -NOISY Informa a los usuarios administradores cuando se entra y sale del modo HTM
    + -QUIET No informa el caso anterior
    + -TO <valor> Especifica el ratio a usar
    IRCop
    stats <opción>
    + B - banversion - Lista de bans
    + b - badword - Lista de badwords
    + C - link - Lista del bloque link
    + d - denylinkauto - Lista del bloque deny link (auto)
    + D - denylinkall - Lista del bloque deny link (todo)
    + e - exceptthrottle - Lista del bloque except throttle
    + E - exceptban - Lista del bloque except ban
    + f - spamfilter - Lista de filtros de spam
    + F - denydcc - Lista del bloque deny dcc
    + G - gline - Lista gline
    +   Flags: [+/-mrs] [máscara] [razón] [autor]
    +     m Devuelve las glines que coincidan o no con la máscara
    +     r Devuelve las glines que coincidan o no con la razón
    +     s Devuelve las glines que coincidan o no con el autor
    + I - allow - Lista bloque allow
    + j - officialchans - Lista de canales oficiales
    + K - kline - Lista del bloque ban user/ban ip/except ban
    + l - linkinfo - Información de las uniones de servidores
    + L - linkinfoall - Toda la información anterior
    + M - command - Lista del uso de cada comando
    + n - banrealname - Lista del bloque ban realname
    + O - oper - Lista del bloque oper
    + S - set - Lista del bloque set
    + s - shun - Lista de shuns
    +   Flags: [+/-mrs] [máscara] [razón] [autor]
    +    m Devuelve las glines que coincidan o no con la máscara
    +    r Devuelve las glines que coincidan o no con la razón
    +    s Devuelve las glines que coincidan o no con el autor
    + P - port - Información sobre puertos
    + q - sqline - Lista sqline
    + Q - bannick - Lista del bloque ban nick
    + r - chanrestrict - Lista del bloque channel deny/allow
    + R - usage - Uso de los recursos
    + t - tld - Lista del bloque tld
    + T - traffic - Información del tráfico de datos
    + u - uptime - Uptime del servidor
    + U - uline - Lista del bloque ulines
    + v - denyver - Lista del bloque deny version
    + V - vhost - Lista del bloque vhost
    + X - notlink - Lista servidores que están separados de la red
    + Y - class - Lista del bloque class
    + z - zip - Información sobre la compresión zlib (si está compilado así)
    + Z - mem - Uso de memoria
    +
    Todos
    module
    + Lista todos los módulosTodos
    close
    + Cierra todas las conexiones desconocidasIRCop
    + +

    + +

    8 – Consejos de seguridad

    +
    +

    Si está preocupado por la seguridad (debería), esta sección le ayudará. Alternativamente puede usarlo como patrones a seguir en toda la red para afianzarla.

    +

    Esta lista está ordenada de mayor a menor riesgo.

    +

    + +

    8.1 Contraseñas
    +

    +Escoja buenas contraseñas para los operadores, links, etc:
    +- Use contraseñas alfanuméricas ("Wfw9eAe") y/o palabras largas.
    +- No use estas contraseñas para aspectos como cuentas de email, foros, etc.
    +

    + +

    8.2 Vulnerabilidades no-IRCD
    +

    +Hay varios aspectos que no están relacionados con el ircd pero que pueden ser puntos potenciales de ataque. Si por ejemplo usa servidores http, dns, smtp y ftp pueden ayudar al factor riesgo. Úselos en cuentas shells y utilice buenos permisos para utilizarlos.
    +

    + +

    8.3 Permisos y archivo de configuración
    +

    +Cerciórese de que su directorio home y UnrealIRCd tienen los permisos correctos. Por otro lado, un usuario local puede coger su archivo para ver las contraseñas. Para evitar esto: chmod -R go-rwx /path/to/Unreal3.2 si no está seguro de ello.
    +Más aspectos. Nunca ponga su UnrealIRCd en un webroot o cualquier otro directorio compartido. Para las copias de seguridad, asegúrese de los permisos.
    +
    +Use siempre que pueda contraseñas encriptadas. La mayoría de contraseñas de 1-8 caracteres se descifran en cuestión de horas o pocos días, sobretodo las contraseñas link::password-connect
    +

    + +

    8.4 Problemas de usuario
    +

    +Muchos de estos problemas no están en esta temática.
    +Escoja siempre operadores y administradoers de confianza. Léase todo detenidamente. Nunca comparta sus discos mediante netbios/kazaa/morpheus/etc. puede coger troyanos. Está bajo su responsabilidad.
    +

    + +

    8.5 SSL/SSH y análisis de conexión
    +

    +Use SSL entre servidores y entre clientes operadores para prevenir el "robo" de contraseñas mediante un espía de conexión ("sniffing"). Alguien que le espíe su conexión podrá ver todo su tráfico de datos, mirar las conversaciones privadas, coger las contraseñas (oper logins, nickserv, etc.). Por la misma razón use ssh en vez de telnet.
    +

    + +

    8.6 Ataques de Denegación de Servicio (DoS) [o: cómo proteger mi hub)
    +

    +Muchos de las redes han experimentado con ataques (D)DoS. Puede reducir su efecto tomando algunas medidas. Muchas de ellas tienen un servidor hub, al que siempre atacan.
    +Detalladamente: +
    +1. Ponga el nombre del servidor a un host que no exista ('hub.mi.red'), que no tenga subdominio. Así el atacante no podrá saber el host a atacar. Tan sólo tendrá que unir sus servidores al hub especificando la IP no pública.
    +    Ejemplo 1: link visibiblename.yournet.com { hostname 194.15.123.16; [etc] };.
    +    Ejemplo 2: link visibiblename.yournet.com { hostname thehostnamethatworks.yournet.com; [etc] };.
    +    Como nota, para el último ejemplo asegúrese que no permiten transferencia de zonas.
    +2. Otro punto importante es ocultar '/stats c' y otra información. De no ser así los atacantes tendrán a su disposición cuantiosa información de real valor. Si quiere despreocuparse por eso, use set { oper-onlye-stats "*"; }; para restringir este comando. Más información en el próximo apartado.
    +
    +Por supuesto estas medidas son menos efectivas si se hacen después de meses de haber empezado, porque la IP puede ser conocida por varios atacantes. Obviamente pueden atacar a servidores leaf, pero requiere más esfuerzo para tumbar la red que no atacando uno o dos puntos vitales.
    +

    + +

    8.7 Información descubierta
    +

    +STATS
    +El comando /stats proporciona numerosa información que posiblemente quiera restringir tanto como sea posible. Muchas de las redes prefieren que los usuarios no tengan acceso a este comando, otros prefieren ocultar '/stats g' o '/stats k'.
    +Es recomendable usar set { oper-only-stats "*"; };  para prohibir todos los /stat para usuarios no operadores. Por ejemplo:
    +- /stats o: da información sobre los operadores y sus hosts
    +- /stats c: da un aidea sobre las uniones entre servidores
    +- /stats g, /stats k: usado para banear proxis. Así el atacante puede tener una lista de proxis que puede usar
    +- /stats E, /stats e: información realmente importante
    +- /stats i, /stats y: puede permitir al atacante conocer muchos hosts de conexiones para atacar
    +- /stats P: muestra los puertos
    +etc etc...
    +
    +MAP / LINKS
    +Mucha gente ha preguntado si hay alguna forma de deshabilitar /map o /links. Pensamos que es absurdo hacerlo y que da una idea errónea sobre seguridad. Ocultar los servidores no es útil si los usuarios ya están dentro de ellos. Para los servidores a los que no quiere que conecten directamente, vea la sección 8.6.
    +Para ello puede usar la opción flat-map (set::options::flat-map) para mostrar los servidores directamente unidos en /map y /link pero sin saber dónde están conectado. Puede ser una medida más para prevenir los ataques a los puntos clave de la red. Obviamente si ocurre un split alguien podrá darse cuenta qué servidores están conectados entre sí.
    +
    +USUARIOS NORMALES Y SNOMASKS
    +Una característica no muy conocida es que los usuarios pueden ponerse snomasks limitados: sólo +s y +sk. Aun así pueden ver rehasehs, identificaciones de opers, kills y otros mensajes.
    +Para deshabilitarlo puede usar set::restrict-usermodes para usarlo con el modo s: set { restrict-usermodes "s";};.
    + + +

    +Por supuesto toda esta información oculta no es altamente segura, pero dificulta su ataque.
    +

    + +

    8.8 Protección contra agujeros explotables
    +

    +Existen varias actualizaciones para los sistemas operativos que hacen más difícil las vulnerabilidades del sistema. No suele ser lo más importante, pero es importante tenerlas al día por varias razones.
    +
    +Use siempre la última versión de UnrealIRCd. Subscríbase a unreal-notify mailinglist +para recibir las actualizaciones (unreal-notify es tan sólo para anuncios, 1 email cada X meses). Usualmente se explica detalladamente en el anuncio si contiene fallos de seguridad.
    +

    + +

    8.9 Sumario
    +

    +Tal y como podrá entender, nunca se puede estar 100% seguro. Sin embargo, entre todos podemos ayudar a reducir los ataques. Tómese su tiempo para montar su red y enseñar a sus operadores. Mucha gente no se preocupa de la seguridad y luego pasa lo que pasa. Trate de evitarlo.
    +

    + + +

    9 – Dudas más frecuentes (FAQ)

    +
    +

    Tiene una FAQ disponible en este enlace

    +
    +

    + + diff --git a/doc/unreal32docs.fr.html b/doc/unreal32docs.fr.html new file mode 100644 index 000000000..a69426527 --- /dev/null +++ b/doc/unreal32docs.fr.html @@ -0,0 +1,3202 @@ + +UnrealIRCd - 3.2 - Official Documentation + + + + + + + +English | +German | +Spanish | +Hungarian | +French +

    +
    UnrealIRCd
    + http://www.unrealircd.com
    + Version: 3.2.2
    + Version courante: 3.2.2
    + Dernière mise à jour de la documentation: 2004-10-11
    +
    + Head Coders: Stskeeps / codemastr / Syzop / Luke
    + Contributors: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
    + Documentation: CKnight^ / Syzop
    + Traduction française: Vincent Guesnard ( Kolibot ) & babass - irc.rs2i.net
    +

    En raison de la complexité croissante d'UnrealIRCd 3.2, nous avons changé pour une navigation plus facile, ce qui nous a permis + de vous donner accès à beaucoup plus de documentations. Pour voir ce document vous devez avoir un navigateur compatible, ils sont + listés ci-dessous. Les mises à jour de ce document sont disponibles ici : + http://www.vulnscan.org/UnrealIrcd/unreal32docs.html + ainsi qu'un FAQ http://www.vulnscan.org/UnrealIrcd/faq/. +

    +

    Navigateurs compatibles:
    +

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

    +

    INDEX / TABLE DES MATIERES
    + 1. Introduction & Notes
    + ---1.1. Notes sur la mise à jour/mixing 3.1.x -> 3.2
    + ---1.2. Notes sur la mise à jour entre versions 3.2
    + 2. Installation
    + 3. Caractéristiques
    + -- 3.1. Cloaking
    + -- 3.2. Modules
    + -- 3.3. Snomasks
    + -- 3.4. Aliases
    + -- 3.5. Helpop
    + -- 3.6. Niveau d'accès des opérateurs
    + -- 3.7. Commandes opérateurs
    + -- 3.8. SSL
    + -- 3.9. IPv6
    + -- 3.10. Zip links
    + -- 3.11. Support des links avec DNS/IP dynamiques
    + -- 3.12. Caractéristiques de l'anti-flood
    + -- 3.13. Types de ban
    + -- 3.14. Spamfilter
    + -- 3.15. CIDR
    + -- 3.16. Autres particularités
    + 4. Configurer votre fichier unrealircd.conf +
    + ---4.1. Explication du fichier de configuration
    + ---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 Directive
    + ---4.10. Loadmodule Directive
    + ---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. Allow DCC Block
    + ---4.28. Vhost Block -=- (vhost.conf)
    + ---4.29. Badword Block -=- (badwords.conf)
    + ---4.30. Uline Block -=- (U:Line)
    + ---4.31. Link Block -=- (C/N/H:Lines)
    + ---4.32. Alias Block
    + ---4.33. Help Block
    + ---4.34. Official Channels Block
    + ---4.35. Spamfilter Block
    + ---4.36. Set Block -=- (networks/unrealircd.conf)
    + 5. Fichiers additionnels
    + 6. Modes utilisateurs & salons
    + 7. Commandes utilisateurs & Opérateurs
    + 8. Conseils de sécurité/checklist
    + ---8.1. Mots de passe
    + ---8.2. Vulnérabilités non liées à l'Ircd
    + ---8.3. Permissions et fichier de configuration
    + ---8.4. Problèmes liés aux utilisateurs
    + ---8.5. SSL/SSH & sniffing
    + ---8.6. Denial of Service attacks (DoS) [ou: comment protéger mon hub]
    + ---8.7. Conseil sur la divulgation d'informations
    + ---8.8. Protection contre les exploits
    + ---8.9. Conclusion
    + 9. Foire au questions (FAQ)
    +

    +

    1.0 – Introduction & Notes
    +

    +

    Ce document a été écris exclusivement pour l'utilisation d'UnrealIRCd. Utiliser ce + document avec un autre logiciel, ou le distribuer avec un autre logiciel est strictement + interdit sans la permission écrite de l'équipe de développement d'UnrealIRCd. Ce document + peut être copié/imprimé/reproduit/publié autant de fois que vous le souhaitez, à condition + que ce soit pour l'utilisation d'UnrealIRCd et qu'il ne soit jamais modifié d'une quelconque manière. + – Copyright UnrealIRCd Development Team 2002-2004

    +

    Lisez ce manuel avant de demander de l'aide, vous devez aussi lire attentivement la + FAQ qui répond à plus de 80% de + vos questions/problèmes. Si vous avez encore besoin d'aide vous pouvez demander du support sur + irc.ircsystems.net (port 6667) channel #unreal-support (notez que nous requerrons de votre part une + parfaite connaissance de ce document et de la FAQ et que nous donnons uniquement de l'aide sur UnrealIRCD, + pas sur les services !). Si vous avez un réel bug (comme un crash) alors reportez le ici + http://bugs.unrealircd.org.

    + +

    1.1 – Notes sur la mise à jour/mixing 3.1.x -> 3.2
    +

    +
    +

    Au cas où vous souhaiteriez mettre à jour Unreal3.1.x vers Unreal3.2 vous noterez que l'ensemble des fichiers + de configuration a changé, vous devriez trouver cela difficile au début, mais une fois que vous aurez changé + vous trouverez cela beaucoup mieux !

    +

    N'oubliez pas de lire la section 3 à propos des caractéristiques, bien que vous connaissiez déjà la plupart + d'entre elles car elles sont issues des 3.1.x, il y en a tout de même de nouvelles !!

    +

    Le mieux n'est pas de mixer une 3.1.x avec une 3.2, mais si vous souhaitez réellement faire cela, vous + aurez besoin d'une version 3.1.4 minimum, mais une 3.1.5 est fortement conseillée.

    + +

    1.2 – Notes sur la mise à jour entre versions 3.2
    +

    +

    Le protocole recommandé pour mettre à jour est :
    +Linux:
    +

      +
    • Renommez votre ancien dossier UnrealIRCd (sinon vous écraserez son contenu dans la prochaine étape) +
    • Extraire la nouvelle version d'UnrealIRCd and écrivez ./Config et make +
    • Copiez vos anciens fichiers de configuration vers le nouveau répertoire (unrealircd.conf, motd, rules, server.* [SSL certs], network file, etc)

    +Windows:
    +
      +
    • Copiez tous vos fichiers de configuration temporairement vers un autre dossier. +
    • Lancez le désinstalleur pour toutes les versions précédentes d'Unreal que vous avez installées. +
    • Lancez l'installeur pour la nouvelle version d'Unreal. +
    • Copiez vos anciens fichiers de configuration vers le nouveau dossier. +
    +

    Veuillez vérifier les RELEASE NOTES pour voir ce qui a changé. Si vous notez des changements (ou bug) + entre les versions, VOUS DEVEZ ÊTRE SUR D'AVOIR LU LES RELEASE NOTES EN PREMIER avant de reporter cela comme un bug.

    + +

    2.0 - Installation

    +
    + Systémes d'exploitation testés et supportés:
    +
      +
    • *NIX versions: +
        +
      • Linux 2.2.x +
      • Linux 2.4.x +
      • FreeBSD 4.6-STABLE +
      • FreeBSD 4.5-STABLE +
      • Solaris 2.x +
      +
    • Windows version: +
        +
      • WindowsXP Home +
      • WindowsXP Pro +
      • Windows 2000 Pro +
      • Windows 2000 Server +
      • Windows 2000 Advanced Server +
      • Windows 98 +
      • Windows Me +
      +
    +
    + Si vous avez Unreal3.2 et qu'il fonctionne correctement sous un autre système d'exploitation, + envoyer les détails ici : docs@unrealircd.com
    +

    +

    Instructions d'installation:
    +Linux:
    +

      +
    1. gunzip -d Unreal3.2.2.tar.gz +
    2. tar xvf Unreal3.2.2.tar +
    3. cd Unreal3.2 +
    4. ./Config +
    5. Répondez à ces questions avec le meilleur de vos connaissances. +Généralement, si vous n'êtes pas sur, les paramètres par défaut devrait fonctionner ! +
    6. make +
    7. Maintenant créez votre unrealircd.conf ainsi que les autres fichiers de configuration, regardez la section 4. +
    +

    +Windows:
    +

      +
    1. Lancez l'installateur d'Unreal +
    2. Maintenant créez votre unrealircd.conf ainsi que les autres fichiers de configuration, regardez la section 4. +
    +

    +

    +

    3.0 - Caractéristiques +

    +

    La plupart des caractéristiques majeures/mineures sont expliquées dans cette section. + Elle fourni une vue d'ensemble, et fait parfois référence aux fichiers de configuration + (quelque chose dont vous ne connaissez encore rien).

    +

    Vous pouvez sauter cette section, toutefois il est suggéré de la lire avant/après l'installation.

    + +

    3.1 - Cloaking

    +

    Le Cloaking vous permet de cacher le véritable host des utilisateurs, par exemple si votre host réel est d5142341.cable.wanadoo.nl, + il sera montré (lors des join, part, whois, etc) ainsi : rox-2DCA3201.cable.wanadoo.nl. + Cette spécificité est utile pour prévenir les floods entre utilisateurs depuis qu'ils ne peuvent plus voir l'host ou l'IP réel.

    +

    Cela est contrôlé par le usermode +x (comme : /mode votrepseudo +x), les administrateurs peuvent forcer le mode +x par défaut, + ou rendre impossible aux utilisateurs d'enlever ce mode.

    +

    Un host cloaked est généré par un module de cloaking (vous devez en avoir un d'amorcé), il y en a 2 officiels à ce jour :
    + cloak: C'est le nouveau module officiel de cloaking qui est plus sécurisé que l'ancien, il utilise la méthode de + hachage md5 et requière 3 set::cloak-keys:: consistant à mixer des caractères alphanumérique (a-z, A-Z et 0-9) + [ex: CZCBd45Q6DmtExAd8Bm2"]. Regardez l'example.conf pour un exemple.
    + oldcloak: C'est l'ancien algorithme utilisé par Unreal3.2 et les versions précédentes, il est ici dans le but + de vous montrer l'évolution du processus de chiffrage des hosts/IP réels. Il n'est plus considéré comme sécurisé + (vous devriez avoir un avertissement si vous l'utilisez) + et vous devriez passer au 'cloak' dès que tous les serveurs seront mis à jour.

    +

    Les Cloak keys DOIVENT être les mêmes sur TOUS LES SERVEURS d'un réseau. Elles doivent être gardées SECRETES car + il est possible de déchiffrer l'host original si vous connaissez ces clés (ce qui rendrait le umode +x obsolète).

    +
    +

    3.2 - Modules

    +

    UnrealIRCd supporte des modules, ce qui est très sympathique car :
    + - Vous pouvez les charger/décharger pendant que l'ircd est lancé (avec /rehash). + Cela vous permet de corriger certains bugs ou d'ajouter de nouvelles spécificités + sans être obligé de redémarrer !
    + - D'autres personnes peuvent créer (3rd party) des modules avec de nouvelles commandes, modes utilisateurs et même des modes channels. + UnrealIRCd contient seulement quelques modules. Regarder ici www.unrealircd.com -> modules ou utiliser google pour trouver des 3rd party modules.
    +

    Vous avez besoin de lancer au moins 2 modules ausinon vous n'aurez pas la possibilité d'amorcer l'ircd ! :
    + - Le module des commandes : commands.so (commands.dll sous windows)
    + - un module de cloaking: habituellement cloak.so (cloak.dll sous windows)

    +
    + +

    3.3 - Snomasks

    +

    Les Snomasks sont des notices serveurs, c'est un type spécial de usermode que vous recevrez sous forme de notices serveurs. + (la plupart du temps, cela est utilisé par les opérateurs).

    +

    Cela peut être établi par: /mode votrepseudo +s SNOMASK, par exemple: /mode votrepseudo +s +cF
    + Pour enlever certains snomasks, utilisez quelque chose comme : /mode votrepseudo +s -c
    + Ou vous pouvez aussi enlever tous vos snomasks en écrivant simplement: /mode votrepseudo -s

    +

    Les snomasks disponibles sont :
    + c - les connexions locales
    + F - les connexions globales (exceptées celles qui proviennent des serveurs qui sont dans vos U:lines)
    + f - les notices de flood
    + k - les notices de kill [*]
    + e - les notices de 'eyes'
    + j - les notices de 'junk'
    + v - les notices de vhost
    + G - les notices de gline/shun
    + n - les changements de pseudo locaux
    + N - les changements de pseudo globaux
    + q - les notices d'interdiction d'utilisation de nick (Q:line)
    + s - recevoir les notices serveurs [*]
    + S - recevoir les notices de l'anti-spam
    + o - recevoir les notices d'identification oper
    + [*: ces snomasks sont autorisés aux non-opérateurs]
    +

    +

    Vous pouvez rendre automatique le don de snomasks (set::snomask-on-connect) et aussi + ceux que vous souhaitez quand vous vous /oper (set::snomask-on-oper, oper::snomask)

    + +

    3.4 - Aliases

    +

    Avec les aliases vous pouvez configurer des commandes rapides. Par exemple "/ns identify blah" + sera envoyé à nickserv (cela sera traduis par : privmsg nickserv identify blah). Vous pouvez + bien entendu créer des alias plus compliqués comme /register qui sera retourné vers Chanserv + si le premier paramètre est un # ou sinon vers nickserv.

    +

    Les aliases sont à configurer dans les alias blocks contenus dans le fichier de configuration, + vous pouvez aussi inclure un fichier avec des aliases par défaut dont la plupart des services se servent.

    + +

    3.5 - Helpop

    +

    UnrealIRCd a un système d'aide accessible via /helpop. La commande /helpop est entièrement configurable + via l'help block dans le fichier de configuration. En supplément, un help.conf est inclus, il contient + une aide basique pour toutes les commandes par défaut.
    + Par exemple /helpop chmodes vous donne la liste de tous les modes channels disponibles d'UnrealIRCd.
    + Rappelez vous que si vous êtes un opérateur (helpop) vous devrez ajouter le préfix ? aux mots clés, + donc /helpop devient /helpop ? et + /helpop chmodes devient /helpop ?chmodes etc..

    + +

    3.6 - Niveau d'accés des opérateurs

    +

    Dans UnrealIRCd, plusieurs niveaux d'opérateurs sont accessibles. Vous pouvez définir des droits supplémentaires (comme l'utilisation de /gline). + Grâce à cela vous pouvez donner aux opérateurs les privilèges dont ils ont besoin.

    +

    Cela est contrôlé par les flags opérateurs dans l'oper block, regardez l'oper block pour plus d'informations.

    + +

    3.7 - Commandes opérateurs

    +

    UnrealIRCd a beaucoup de commandes performantes pour les opérateurs qui sont expliquées dans Commandes utilisateurs et opérateurs, + vous voudrez probablement lire cela après l'installation :)

    + +

    3.8 - SSL

    +

    Le SSL (Secure Socket Layer) vous permet de sécuriser les connexions grâce à un chiffrement des E/S. + Vous pouvez l'utiliser pour sécuriser le trafic entre serveurs mais aussi le trafic client<->serveur. + Habituellement, le SSL est utilisé pour protéger contre le sniffing et pour l'authentification.

    +

    Pour l'utiliser, il vous faudra compiler votre IRCd avec le support SSL. Pour avoir un port SSL, voici la syntaxe : listen::options::ssl.

    +

    Les connexions SSL ne sont pas par défaut (donc ne mettez pas le port 6667 en SSL !!), il vous faut un client ou un tunnel qui supporte le protocol SSL.

    +

    Clients supportant le SSL: XChat, + irssi, + mIRC (6.14 et supérieures, + requiert certaines dlls additionelles)

    +

    Pour les clients ne supportant pas le SSL vous pouvez utiliser un tunnel comme + stunnel, ci-dessous, un exemple de stunnel.conf ( pour stunnel 4.x):
    +

       client = yes
    +   [irc]
    +   accept = 127.0.0.1:6667
    +   connect = irc.myserv.com:6697
    +
    + Si vous vous connectez sur 127.0.0.1 port 6667, votre trafic sera chiffré et retourné vers irc.myserv.com port 6697 (un port SSL).

    +

    Il faut aussi que vous ayez des certificats valides quand vous vous connectez aux serveurs et ne pas les accepter aveuglément + (comme dans l'exemple stunnel) sinon vous serez vulnérable aux attaques "active sniffing" (ssl redirects). + Ce n'est toutefois pas l'endroit approprié pour en parler (renseignez vous sur le SSL, ne nous demandez rien). + [mIRC et xchat vous donne la possibilité d'accepter ou non un certificat, ce qui est parfait].

    +

    3.9 - IPv6

    +

    UnrealIRCd supporte l'IPv6, depuis la beta15 cela semble être stable.
    + Votre OS a besoin d'avoir le support IPv6 et il faut valider le support IPv6 durant le ./Config.
    +

    Bien que Microsoft ai une implantation expérimentale de l'IPv6 pour w2k/XP, cela n'est pas (encore) supporté par UnrealIRCd.

    + +

    3.10 - Zip links

    +

    Les Zip links peuvent être activés pour les links entre serveurs, il compresse les données en utilisant zlib. + Il peut sauvegarder entre 60 et 80% de votre bande passante... Donc, cela est très utilisé pour les links ayant + des bandes passantes faibles ou les links avec énormément d'utilisateurs, cela peut beaucoup aider quand vous + lancez un /connect et que le serveur à relier contient de nombreux utilisateurs/channels/etc...

    +

    Pour compiler avec le support zip links, il faudra répondre Yes lors de la question portant sur le zlib pendant le + ./Config et ajouter dans votre link block link::options::zip (des deux côtés).

    + +

    3.11 - Support des links avec IP/DNS dynamiques

    +

    UnrealIRCd a quelques (nouvelles) spécificités qui aideront les utilisateurs ayant des IP dynamiques et qui utilisent des DNS dynamiques + (comme blah.dyndns.org). Si vous linkez 2 hosts DNS dynamiques, voici ce que vous devrez mettre : + link::options::nodnscache et link::options::nohostcheck.

    + +

    3.12 - Caractéristiques Anti-Flood

    +

    +Throttling
    +Le Throttling est une méthode qui vous permet de déterminer le temps minimum pour qu'un client se reconnecte après une déconnexion à votre serveur. +Vous pouvez configurer cela dans votre set::throttle block pour autoriser X connexions toutes les YY secondes depuis la même IP.
    +Modes des salons
    +Certains modes channels sont très efficaces contre le flood. En voici quelque uns:
    +K = /knock interdit, N = changements de pseudo interdits, C = CTCPs interdits, M = seul les utilisateurs enregistrés peuvent parler.
    +Depuis la beta18, il y a un mode channel beaucoup plus avancé +f...
    +Mode salon f
    +A la place d'utiliser des scripts ou des bots pour vous protéger du flood, cela est maintenant possible dans l'ircd.
    +Un exemple du mode +f est : *** Blah sets mode: +f [10j]:15
    +Cela signigie que 10 joins sont autorisés toutes les 15secondes sur le salon, si la limite est atteinte, le salon va mettre automatiquement le mode +i +Les types de flood suivant sont disponibles :
    + + + + + + + + +
    Type:Nom:Action par défaut:Autres actions possibles:Commentaires
    cCTCPsauto +Cm, M 
    jjoinsauto +iR 
    kknocksauto +K (uniquement pour les clients locaux)
    mmessages/noticesauto +mM 
    nnickchangesauto +N  
    ttextkickbpar messages/notices utilisateurs comme l'ancien +f. Kick ou ban l'utilisateur.
    +

      +Example: +

    *** 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
    +
    + +En fait, cela peut être plus avancé/compliqué:
    +A la place de l'action par défaut, vous pouvez spécifier d'autres types de flood, par exemple : +f [20j#R,50m#M]:15
    +Cela mettra le salon en +R si la limite de join est atteinte (>20 joins en 15 secondes), +et mettra le salon en +M si la limite de message est atteinte (>50 messages en 15 secondes).
    +
    +Il y a également des paramètres que vous pouvez ajouter pour enlever les modes après X minutes : +f [20j#R5]:15 mettra le salon en +R si la +limite est atteinte et l'enlevera après 5 minutes.
    +Un serveur peut avoir un temps par défaut pour l'enlèvement de ces modes (set::modef-default-unsettime) donc si vous écrivez +f [20j]:15, celà pourra être +transformé en +f [20j#i10]:15, c'est juste par défaut, vous pouvez toujours mettre [20j#i2]:15 ou quelque chose dans le genre, +et vous pouvez aussi annuler complétement le retrait automatique en faisant : +f [20j#i0]:15 (un 0 explicite).
    +
    +L'ancien mode +f (msgflood par un utilisateur) est aussi toujours disponible via 't', +f 10:6 est maintenant appelé +f [10t]:6 et ++f *20:10 est maintenant +f [20t#b]:10. Actuellement l'ircd devrait automatiquement convertir l'ancien mode +f vers le nouveau. +Notez qu'il n'y a aucun unsettime disponible pour les bans via 't' ([20t#b30]:15 ne fonctionne pas).
    +
    +Le meilleur mode +f dépend fortement du salon... combien d'utilisateurs a t'il ? Avez vous un jeu qui fait que les utilisateurs envoient +beaucoup de messages (ex:trivia) ? Est ce un genre de salon principal ou en auto-join? etc...
    +Il n'y a pas un mode +f parfait pour tous les salon s, mais pour commencer regardez +l'exemple suivant et modifiez le en fonction de vos besoins:
    ++f [30j#i10,40m#m10,7c#C15,10n#N15,30k#K10]:15
    +30 joins toutes les 15 secondes, si la limite est atteinte, le salon met le mode +i pour 10 minutes.
    +40 messages toutes les 15 secondes, si la limite est atteinte, le salon met le mode +m pour 10 minutes.
    +7 ctcps toutes les 15 secondes, si la limite est atteinte, le salon met le mode +C pour 15 minutes.
    +10 changements de pseudo toutes les 15 secondes, si la limite est atteinte, le salon met le mode +N pour 15 minutes.
    +30 knocks toutes les 15 secondes, si la limite est atteinte, le salon met le mode +K pour 10 minutes.
    + +Si le salon a beaucoup d'utilisateurs (>75 ?) vous devrez augmenter la sensibilité du join (par ex: 50) et bien entendu +la limite de messages (par ex: 60 ou 75).
    +Les temps de retrait des modes est spécialement une question de goût... vous devez +vous en douter... Que faire si aucun op n'est disponible quand un événement se produit, voudrais-je +que le salon soit bloqué pendant 15 minutes (= pas agréable pour les +utilisateurs) ou 5 minutes (= la fautif n'ayant qu'à attendre 5m et flooder +à nouveau). Ca dépend aussi du type de flood, les utilisateurs sont incapables de rejoindre le salon (+i) ou +parler (+m) est pire que de leur empecher de changer leur pseudo (+N) +ou d'envoyer des ctcps au salon (+C) onc vous devrez établir différents temps de +retrait des modes. +

    + +

    3.13 - Types de ban

    +

    +Les types de ban basiques et les cloaked hosts
    +UnrealIRCd supporte les types de ban basiques comme +b nick!user@host.
    +Mais aussi, si l'host masqué de quelqu'un est 'rox-ACB17294.isp.com' et que vous posez un ban *!*@rox-ACB17294.isp.com, +alors si l'utilisateur enlève le mode x (/mode votrepseudo -x) (et son host devient par exemple 'dial-123.isp.com') +alors le ban fonctionnera toujours. Les bans sont toujours vérifiés pour les hosts réels ET les hosts masqués.
    +Les bans avec des IP sont aussi disponibles (ex: *!*@128.*) et sont aussi toujours vérifiés.
    +
    +Les bans sur les cloaked IPs requièrent quelques explications :
    +Si l'IP d'un utilisateur est 1.2.3.4 son cloaked host pourrait être 341C6CEC.8FC6128B.303AEBC6.IP.
    +Si vous bannissez *!*@341C6CEC.8FC6128B.303AEBC6.IP vous bannirez donc aussi *!*@1.2.3.4 (ce qui semble évident...)
    +Si vous bannissez *!*@*.8FC6128B.303AEBC6.IP vous bannissez *!*@1.2.3.*
    +Si vous bannissez *!*@*.303AEBC6.IP vous bannissez *!*@1.2.*
    +Cela devrait vous aider à savoir comment un ban doit être établi le moment venu.
    +
    +Types de ban étendus
    +Les bans étendus ressemble à ~[!]<type>:<stuff>. Actuellement, les types suivant sont disponibles:
    + + + + + + +
    type:nom:explication:
    ~qquietLes personnes conformes à ces bans peuvent rejoindre les salons mais ne peuvent pas parler, + si ils n'ont pas au moins comme flag +v. Ex: ~q:*!*@blah.blah.com
    ~nnickchangeLes personnes conformes à ces bans ne peuvent pas changer de pseudo, + si ils n'ont pas au moins comme flag +v. Ex: ~n:*!*@*.aol.com
    ~cchannelSi l'utilisateur est sur ce salon, il ou elle ne pourra pas rejoindre le salon. +Ex: ~c:#lamers
    ~rrealnameSi le nom réel d'un utilisateur est conforme alors il ne pourra pas rejoindre le salon.
    + Ex: ~r:*Stupid_bot_script*
    + NOTE: un underscore ('_') correspond aussi bien à un espace (' ') qu'à un underscore ('_'), donc ce ban correspondra à + 'Stupid bot script v1.4'.
    +Ces types de bans sont aussi supportés dans la liste d'exception (+e) d'un salon.
    +Certains modules peuvent ajouter d'autres types de ban étendus.
    +

    + +

    3.14 - Spamfilter

    +

    Le Spamfilter est un nouveau système de lutte contre le spam, la publicité, les worms et plein d'autres choses. + Il fonctionne un peu comme que le système de badwords mais il a de nombreux avantages.

    +

    Les Spamfilters sont ajoutés grâce à la commande /spamfilter qui utilise la syntaxe suivante:
    + /spamfilter [add|del|remove|+|-] [type] [action] [tkltime] [reason] [regex]
    + + + + + + +
    [type] Spécifie le type de la cible:
    + + + + + + + + + + +
    Char:Config item:Description:
    cchannelChannel message
    pprivateMessage privé(d'utilisateur à utilisateur)
    nprivate-noticePrivate notice
    Nchannel-noticeChannel notice
    PpartPart reason
    qquitQuit reason
    ddccDCC filename
    uuserBan utilisateur, serra comparé à nick!user@host:realname
    + Vous pouvez spécifier plusieurs cibles, comme : cpNn
    [action] specifie l'action devant être prise (seule 1 action peut être specifiée)
    + + + + + + + + + + + +
    killkill l'utilisateur
    tempshunshun le session courante de l'utilisateur (si il se reconnecte le shun n'est valable)
    shunmet un shun sur l'host
    klinemet une kline sur l'host
    glinemet une gline sur l'host
    zlinemet une zline sur l'host
    gzlinemet sur une gzline ( zline globale ) sur l'host
    blockbloque seulement le message
    dccblockmarque l'utilisateur et l'empêche donc d'envoyer d'autres DCCs
    viruschanpart tous les salons, rejoint le set::spamfilter::virus-help-channel, désactive toutes les commandes + excepté PONG, ADMIN, et msg/notices vers le set::spamfilter::virus-help-channel
    [tkltime] Durée de la *line ajoutée par le filre, utilisez '-' pour mettre la valeur par défaut ou pour passer outre + (ex: si action = 'block')
    [reason] Raison du Block ou de la *line... Vous NE POUVEZ PAS, mais des underscores ('_') seront traduits + par des espaces lors de l'utilisation. Et un double underscore ('__') donne un underscore ('_'). Encore une fois, utilisez '-' pour utiliser la valeur par défaut.
    [regex] Ceci est le vrai regex ou "bad word" correspondant au terme qui doit bloquer le message et lancer l'action.
    +
    + Voici un exemple: /spamfilter add pc gline - - Come watch me on my webcam
    + Si le texte come watch me on my webcam est trouvé dans un message privé ou sur un salon + alors le message sera bloqué et une gline sera immédiatement ajoutée.
    + Un autre exemple: /spamfilter add pc block - - come to irc\..+\..+
    + Ceci est un regex qui sera validé sur Hi, come to irc.blah.net etc....
    + Et un dernier exemple avec un temps/raison :
    + /spamfilter add p gline 3h Please_go_to_www.viruscan.xx/nicepage/virus=blah Come watch me on my webcam
    + Si come watch me on my webcam est trouvé dans un message privé alors l'utilisateur est gline pour 3 heures + avec comme raison : Please go to www.viruscan.xx/nicepage/virus=blah.
    +
    + Les Spamfilters ajoutés avec /spamfilter sont globaux. Ils fonctionnent que l'utilisateur/salon + ait le mode +G défini ou pas, seuls les opérateurs et les ulines (services) sont exemptés de filtrage. +

    +

    Vous pouvez aussi ajouter des spamfilters dans le fichier de configuration mais ceux ci seront des + spamfilters locaux (non globaux, mais vous pouvez utiliser d'autres "includes" pour cela). + La syntaxe de ces spamfilters { } block sont expliqués ici
    + Exemple:
    +

    spamfilter {
    +	regex "//write \$decode\(.+\|.+load -rs";
    +	target { private; channel; };
    +	reason "Generic $decode exploit";
    +	action block;
    +};

    + +

    set::spamfilter::ban-time vous autorise à modifier le ban time par défaut pour les *lines ajoutées par le spamfilter (défaut: 1 jour)
    + set::spamfilter::ban-reason vous autorise à spécifier une raison par défaut pour les *lines (défaut: 'Spam/advertising')
    + set::spamfilter::virus-help-channel vous autorise à spécifier le salon à joindre pour l'action 'viruschan' (défaut: #help)
    + set::spamfilter::virus-help-channel-deny vous autorise à bloquer tout join normal au virus-help-channel (défaut: no)
    +

    + +

    3.15 - CIDR

    +

    UnrealIRCd a maintenant un support pour le CIDR (Classless Interdomain Routing). CIDR vous + permet de bannir des ranges d'IP. Des Ips sont allouées aux FAI en utilisant CIDR, cela vous + permet en plaçant un ban basé sur le CIDR de bannir facilement un FAI. Unreal supporte le CIDR + pour l'IPv4 et l'IPv6. Les masques CIDR peuvent être utilisés dans l'allow::ip, ban user::mask, + ban ip::mask, except ban::mask, except throttle::mask, et except tkl::mask (pour gzline, gline, et shun). + De plus, le CIDR peut être utilisé dans les /kline, /gline, /zline, /gzline, et /shun. Unreal + utilise la syntaxe standard d'IP/bits, 127.0.0.0/8 (correspond à 127.0.0.0 - 127.255.255.255), + et fe80:0:0:123::/64 (correspond à fe80:0:0:123:0:0:0:0 - fe80:0:0:123:ffff:ffff:ffff:ffff).

    + +

    3.16 - Autres particularités

    +

    UnrealIRCd a énormément de particularités donc tout n'est pas exposé ici... Vous découvrirez tout cela par vous même.

    + +

    +

    4.0 - Configurer votre unrealircd.conf +

    +

    Tout d'abord, créer un bon unrealircd.conf vous prendra un peu de temps, certainement quelquechose + comme 10 - 60 min. Vous pouvez essayer de le lancer le plus tôt que vous pouvez et le modifier plus tard, + ou alors vous pouvez étudier les sections principales directement pas-à-pas ce qui est la méthode recommandée :p. + Si vous avez un problème, vérifiez votre syntaxe, regardez dans le manuel et la FAQ avant de demander + de l'aide ou de rapporter un bug.

    +

    4.1 Explication du fichier de configuration

    +

    +

    Le nouveau système utilise un système basé sur des blocs. Chaque entrée, ou bloc, dans le nouveau format a un format spécifique. + Le format est du type :

    +
    <nom du bloc> <valeur du bloc> {
    +	<directive du bloc> <valeur du bloc>;
    +};
    +

    +

    <nom du bloc> est le type du bloc, tel que me, ou admin. <valeur du bloc> + parfois spécifie une valeur, telle que /oper login, mais d'autres fois ce sera des + sous-types tel que dans un ban utilisateur.

    +

    <directive du bloc> est une variable individuelle spécifique au bloc, et + <valeur de la directive> contient des espaces, ou des caractères représentant + un commentaire qui doit être contenu entre des guillemets. Si vous voulez utiliser un + guillemet à l'intérieur à l'intérieur d'un commentaire (texte entre guillemets) + utilisez \" et il sera interprété comme un caractère simple.

    +

    Une <directive du bloc> peut contenir des directives, si c'est le cas elle aura + elle aura son propre jeu d'accolades l'entourant. Certains blocs n'ont pas de directives + et sont juste spécifiés par <valeur du bloc>, tel que include. + Notez aussi qu'il n'y a pas de format défini, cela veut dire qu'un bloc peut tenir sur une + seule ligne comme sur plusieurs lignes. Le format ci-dessus est ce qui est normalement utilisé + (et qui sera utilisé dans ce fichier) parce qu'il est facile à lire.

    +

    Note : le fichier de configuration est sensible aux majuscules / minuscules (case sensitive) + donc NOM-DU-BLOC n'est pas la même chose que nom-du-bloc. Il y a une notation spéciale utilisée + pour parler d'entrées dans le fichier de configuration. Par exemple pour parler du <nom de la directive> + dans l'exemple ci-dessus, vous devrez dire <nom du bloc>::<directive du bloc>, et si + la directive a un sous bloc que vous voulez référencer, vous ajouterez un autre :: et le nom + de la sous directive.

    +

    Pour parler d'une directive non nommée vous devrez mettre <nom du bloc>:: qui voudra + dans ce cas dire <valeur du bloc>, ou cela pourra être une entrée dans un sous bloc + qui n'a pas de nom.

    +

    Trois types de commentaires sont supportés :

    +

    # commentaire d'une seule ligne
    + // Ocommentaire d'une seule ligne
    + /* Commentaire
    +     multi-ligne */
    +

    +

    Maintenant que vous savez comment ça fonctionne, créez votre unrealircd.conf ou copiez doc/example.conf + et commencez à l'éditer. Il est recommandé d'y aller pas à pas avec les différents blocs et de suivre ce + manuel de référence.

    +

    +

    4.2 - Me Block + OBLIGATOIRE (Connu précédemment comme M:Line)

    +

    +

    Syntaxe:
    +

    me {
    +	name <nom du serveur>;
    +	info <description du server>;
    +	numeric <numeric du serveur>;
    +};
    +

    +

    Ces valeurs sont plutôt claires. Le nom défini le nom du serveur, + info défini les ligne d'information sur le serveur, numeric défini + un numérique pour identifier le serveur. Ce dernier doit avoir une valeur comprise + entre 1 et 255 qui est SPÉCIFIQUE au serveur ce qui signifie qu'aucun autre serveur + du réseau ne doit avoir le même numérique.

    +

    Exemple:
    +

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

    +

    +

    4.3 - Admin Block + OBLIGATOIRE (Connu précédemment comme A:Line)

    +

    +

    Syntaxe:
    +

    admin {
    +	<text-line>;
    +	<text-line>;
    +};
    +

    +

    +

    Ce bloc défini le texte qui sera affiché lors d'une requête /admin. Vous pouvez + spécifier autant de lignes que vous le souhaitez et elles peuvent contenir toutes + les informations que vous voulez, mais il est standard d'indiquer les pseudos et email + des admins au minimum. Vous pouvez également inclure d'autres informations sur les + contacts que vous désirez donner.

    +

    Exemple:
    +

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

    +

    +

    4.4 - Class Block + OBLIGATOIRE (Connu précédement comme Y:Line)

    +

    +

    Syntaxe:
    +

    class <name> {
    +	pingfreq <ping-frequency>;
    +	connfreq <connect-frequency>;
    +	maxclients <maximum-clients>;
    +	sendq <send-queue>;
    +	recvq <recv-queue>;
    +};
    +

    +

    +

    Les Class blocks sont les classes dans lequels les connections seront placées (par exemple pour les + allow blocks ou les serveurs des link blocks), vous avez généralement plusieurs class blocks (exemple : pour les serveurs, clients, opers).

    +

    name est la description, comme "clients" ou "serveurs", ce nom est utilisé comme + référence pour les classes dans allow/link/oper/etc blocks.

    +

    pingfreq est le nombre de secondes entres les PINGs depuis le server (quelquechose entre 90 et 180 secondes est recommandé).

    +

    connfreq est utilisé uniquement pour les serveurs et représente le nombre de secondes entre 2 tentatives de connections si l'autoconnection est activée.

    +

    maxclients spécifie le nombre maximum (total) de clients / serveurs pouvant faire partie de cette classe.

    +

    sendq spécifie la quantité d'informations pouvant être dans la file d'envoi (send queue) (très grand pour les serveurs avec une faible bande passante, moyen pour les clients).

    +

    recvq spécifie la quantité d'informations pouvant être dans la file de reception (receive queue) et est utilisé pour contrôler le flood (cela s'applique uniquement aux + utilisateurs normaux, essayez avec des valeurs 3000-8000, 8000 est la valeur par défaut).

    +

    Exemples:
    +

    class clients {
    +	pingfreq 90;
    +	maxclients 500;
    +	sendq 100000;
    +	recvq 8000;
    +};
    +
    +class servers{
    +	pingfreq 90;
    +	maxclients 10; /* Nombre maximal de serveur pouvant être linké au même moment */
    +	sendq 1000000;
    +	connfreq 100; /* Combien de secondes entre 2 tentatives de connexions */
    +};
    +

    +

    +

    4.5 - Allow Block + OBLIGATOIRE (connu précédemment comme I:Line)

    +

    +

    Syntaxe:
    +

    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>;
    +		...
    +	};
    +};
    +

    +

    C'est ici que vous spécifiez qui peut se connecter à ce serveur, vous pouvez avoir plusieurs allow blocks.

    +

    A propos des correspondances
    + Le contrôle des accès fonctionne comme ceci : concordances des ip ou des host, donc "hostname *@*"; et "ip *@1.2.3.4" + signifiera que ça concordera toujours. Les allow blocks sont lus de haut en bas, donc vous devez spécifier les host/ip + particuliers APRÈS votre allow block général *@*. De plus, si vous voulez spécifier un bloc basé uniquement sur la + correspondance à un ip, alors mettez pour l'hostname quelque chose d'invalide, tel que "hostname PERSONNE;", + cela permettra au bloc de ne vérifier que la correspondance de l'ip.

    +

    ip
    + L'ip mask est de la forme user@ip, user est l'ident et souvent est défini par *, ip est l'ipmask. Quelques exemples : *@* + (depuis n'importe où), *@192.168. * (seulement depuis les adresses commençant par 192.168), etc.

    +

    host
    + Également un user@host hostmask, encore une fois... user est souvent défini par *. Quelques exemples : *@* (n'importe où), + *@*.wanadoo.fr (seulement depuis wanadoo.fr).

    +

    password (optionnel)
    + Requiert un mot de passe à la connexion. Vous devez également spécifier une méthode d'encryption des mot de passe ici. +

    +

    class
    + Spécifie le nom de la classe dans lequel les connections relevant de cet allow block sont placées. +

    +

    maxperip (optionnel, mais recommendé)
    + Vous permet de spécifier combien de connections à ce serveur sont autorisées par ip (exemple : maxperip 4;). +

    +

    redirect-server (optionnel)
    + Si la classe est pleine, les utilisateurs seront redirigés vers ce serveur (si les clients le supporte [mIRC 6 le fait]).

    +

    redirect-port (optionnel)
    + Si un serveur de redirection est spécifié vous pouvez définir le port ici, sinon ce sera le 6667.

    +

    options block (optionnel)
    + Les options valides sont :
    +   useip toujours afficher l'ip à la place de l'hostname
    +   noident n'utilise pas d'ident mais l'username spécifié par le client
    +   ssl ne fonctionne que si le client est connecté via ssl
    +   nopasscont concordance continue si aucun mot de passe n'est donnée (ainsi vous pourrez mettre des clients dans des +classes spéciales si ils fournissent un mot de passe). +

    Exemples:
    +

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

    +

     

    +

    4.6 - Listen Block + OBLIGATOIRE (Connu précédemment comme P:Line)

    +

    +

    Syntaxe:
    +

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

    +

    +

    Ce bloc vous permet de spécifier les ports d'écoute de votre IRCd. + Si aucune option n'est requise, vous devez le spécifier sans aucune directive + sous la forme listen <ip:port>;.

    +

    ip et port
    + Vous pouvez mettre * comme valeur pour ip pour toutes les accepter, ou en spécifier une pour accepter + uniquement les connexions sur cette ip (habituellement requis chez des loueurs de shell). Le port est + le port que vous voulez écouter. Vous pouvez également spécifier un intervalle de ports à la place d'une + valeur unique. Par exemple, 6660-6669 écoutera du port 6660 au port 6669 (inclus). Pour les utilisateur + d'IPv6, voir ci-dessous.

    +

    Info pour les utilisateurs de l'IPv6
    + Si vous avez un serveur Ipv6 vous devrez inclure les ip entre crochets. Comme [::1]:6667 (écouter en localhost + sur le port 6667). Si vous utilisez l'IPv6 et que vous voulez écouter une adresse Ipv4 spécifique vous devrez + utiliser ::ffff:ipv4ip. Par exemple : [::ffff:203.123.67.1]:6667 qui écoutera à 203.123.67.1 sur le port 6667. + Évidemment, vous pouvez aussi juste utiliser *.

    +

    options block (optionnel)
    + Vous pouvez spécifier des options spéciales pour ce port si vous le souhaitez, les options possibles sont :
    + + + + + +
    clientsonly
    port réservé aux clients
    serversonly
    port réservé aux serveurs
    java
    support CR java
    ssl
    port encrypté SSL
    +

    + +

    Exemples:

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

    +

    Si il n'y a pas d'options :

    +

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

    +

    4.7 - Oper Block + RECOMMENDE (Connu précédemment comme 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>;
    +	modes <modes>;
    +	maxlogins <num>;
    +};
    +

    +

    L'oper block vous permet d'assigner des IRC Opérateurs pour votre serveur. Le oper:: + spécifie le login pour la commande /oper. Le oper::from::userhost est le masque user@host + auquel l'utilisateur doit correspondre, vous pouvez spécifier plus qu'un seul hostmask en + créant plusieurs oper::from::userhost. Le oper::password est le mot de passe que l'utilisateur + doit spécifier, oper::password:: vous permet de spécifier une méthode d'authentification pour ce mot de passe, + les types d'authentifications valides sont crypt, md5 et sha1, ripemd-160. Si vous voulez laisser + un mot de passe non crypté ne mettez pas ce sous-bloc.

    +

    Notez s'il vous plait que le login et le mot de passe sont tous deux case sensitive autrement dit les majuscules + et les minuscules ont leurs importance.

    +

    La directive oper::class spécifie le nom d'une classe préexistante (apparaît avant dans le fichier + de configuration) que le oper block utilisera.

    +

    La directive oper::flags a deux formats. Si vous voulez utiliser l'ancien style d'oper flags, + OAa, vous utilisez la méthode flags <flags> method, si vous voulez utiliser la nouvelle méthode, + alors vous utiliserez la méthode flags { <flag>; } Ci-dessous ce trouve la liste des flags + (dans les deux formats) et leurs correspondances.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Ancien Flag
    Nouveau Flag
    Description
    o
    local
    Fait de vous un local operator
    O
    global
    Fait de vous un global operator
    C
    coadmin
    Fait de vous un coadmin
    A
    admin
    Fait de vous un admin
    a
    services-admin
    Fait de vous un services admin
    N
    netadmin
    Fait de vous un Network Admin
    r
    can_rehash
    Oper pouvant utiliser /rehash
    D
    can_die
    Oper pouvant utiliser /die
    R
    can_restart
    Oper pouvant utiliser /restart
    h
    helpop
    Oper reçoit umode +h (helpop)
    w
    can_wallops
    Oper pouvant envoyer des /wallops
    g
    can_globops
    Oper pouvant envoyer des /globops
    c
    can_localroute
    Peut se connecter aux serveurs localement
    L
    can_globalroute
    Peut se connecter aux serveurs globalement
    k
    can_localkill
    Peut /kill les utilisateurs locaux
    K
    can_globalkill
    Peut /kill les utilisateurs globaux
    b
    can_kline
    Peut utiliser /kline
    B
    can_unkline
    Peut utiliser /kline -u@h
    n
    can_localnotice
    Peut envoyer des notices sur le serveur local
    G
    can_globalnotice
    Peut envoyer des notices globales
    z
    can_zline
    Peut utiliser /zline
    t
    can_gkline
    Peut utiliser /gline, /shun et /spamfilter
    Z
    can_gzline
    Peut utiliser /gzline
    W
    get_umodew
    Mets umode +W lorsque vous vous oper
    H
    get_host
    Vous applique un oper host
    v
    can_override
    Peut utiliser OperOverride
    q
    can_setq
    Peut utiliser l'usermode +q
    X
    can_addline
    Peut utiliser /addline
    d
    can_dccdeny
    Peut utiliser /dccdeny et /undccdeny
    +

    Certain flags give you other flags by default:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    localglobaladmin/coadminservices-adminnetadmin
    can_rehashcan_rehashcan_rehashcan_rehashcan_rehash
    helpophelpophelpophelpophelpop
    can_globopscan_globopscan_globopscan_globopscan_globops
    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
    +

    La directive oper::swhois vous permet d'ajouter une ligne supplémentaire dans le + whois d'un oper. [optionnel]

    +

    La directive oper::snomask vous permet d'obtenir automatiquement les snomaks que vous + souhaitez lors d'un /oper. Pour avoir la liste des SNOMASKs possibles reportez vous à la + Section 3.3 [optionnel]

    +

    La directive oper::modes vous permet de prédéfinir un mode oper lors de l'identification. + [optionnel]

    +

    La directive oper::maxlogins vous permet de restreindre le nombre de login oper concurrent + pour un host, par exemple si vous définissez 1 alors, une seule personne pourra se oper à partir + d'un bloc à n'importe quel moment. + [optionnel]

    + +

    Exemple:
    +

    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 "Example of a whois mask";
    +	snomask frebWqFv;
    +};
    +

    +Quelques petites informations à propos d' OperOverride :
    +Les OperOverride sont des choses comme : joindre un salon +ikl et passer outre les bans +(vous devez d'abord vous inviter), vous oper sur le salon, etc.
    +L'operflag can_override a été ajouté de manière à stopper les abus d'opers. Aucun oper n'est +capable d'override par défaut, vous devez explicitement leur donner le flag can_override. +

    +

    4.8 - DRpass Block + RECOMMENDE (connu précédemment comme X:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Ce bloc défini les mots de passe /restart et /die avec respectivement drpass::restart + et drpass::die. Les drpass::restart:: et drpass::die:: vous permettent de spécifier le + type d'authentification qu'ils utilisent. Les types d'authentification actuellement + supportés sont crypté, md5 et sha1, ripemd-160.

    +

    Exemple:

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

    +

    +

    4.9 - Include Directive

    +

    +

    Syntaxe:
    + include <file-name>;

    +

    Cette directive spécifie le nom de fichier devant être chargé comme fichier de configuration séparé. + Ce fichier peut contenir n'importe quel type de bloc de configuration et peut également inclure d'autres + fichiers. Les wildcards sont supporté dans le nom du fichiers pour vous permettre de charger plusieurs + fichiers en une fois.

    +

    exemple 1: un fichier réseau
    +

    include mynetwork.network;

    +

    Ce sera la syntaxe à utiliser si vous voulez utiliser un fichier réseau séparé. Les fichiers réseaux + séparés ne sont plus requis; tous les paramètres réseaux peuvent être insérés directement dans + unrealircd.conf. Ou vous pouvez mettre un include pour les charger depuis le fichier.

    +

    exemple 2: aliases
    +

    include aliases/ircservices.conf

    +

    Un autre exemple est de l'utiliser pour inclure des alias blocks, UnrealIRCd est fournis avec des fichiers + contenant les bons aliases pour beaucoup de services:
    +

      +
    • 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 Directive + OBLIGATOIRE

    +

    +

    Syntaxe:
    + loadmodule <file-name>;

    +

    Reportez-vous ici pour voir pourquoi les modules sont biens/utiles.

    +

    Modules qui viennent standards avec Unreal3.2 :

    +

    commands.so / commands.dll - Toutes les / commandes (en réalité pas encore toutes, mais pourra éventuellement être toutes) OBLIGATOIRE
    + cloak.so / cloak.dll - Cloaking module OBLIGATOIRE (ou n'importe quel autre cloaking module)

    +

    Si vous voulez être sur que ceux si seront chargés :

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

    ou sous windows:

    +
    loadmodule "modules/commands.dll";
    +loadmodule "modules/cloak.dll";
    +
    +
    +

    4.11 - Log Block + OPTIONNEL

    +

    +

    Syntaxe:
    +

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

    +

    Le log block vous permet d'assigner différents fichiers de log pour différentes actions. + Le log:: contient le nom du fichier de log. log::maxsize est une directive optionnelle + vous permettant de spécifier la taille à laquelle vous voulez que le fichier soit effacé et relancé. + Vous pouvez utiliser MB pour megabytes, KB pour kilobytes, GB pour gigabytes. + Le log::flags spécifie quel type d'information sera dans ce log. + Ci-dessous la liste des flags disponibles.

    +

    Vous pouvez également avoir plusieurs log block, pour loguer différentes choses dans des fichiers différents.

    +

    Flags disponibles:
    + + + + + + + + + + + + +
    errorserreurs
    killslogue le /kill notices
    tkllogue les infos sur les *lines, shun et spamfilters (ajout/suppression/expiration)
    connectslogue les connexions / déconnexions des utilisateurs
    server-connectslogue les connections / squit des serveurs
    klinelogue l'usage des /kline
    operlogue les tentatives de s'oper (réussies et ratées)
    sadmin-commandslogue l'usage des /sa* (samode, sajoin, sapart, etc.)
    chg-commandslogue l'usage des /chg* (chghost, chgname, chgident, ect.)
    oper-overridelogue l'usage des operoverrides
    spamfilterlogue les concordances au spamfilter
    +

    + +

    Exemple:

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

    +

    +

    4.12 - TLD Block + OPTIONNEL (connu précédemment comme T:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Le tld block vous permet de spécifier un motd, rules (règles), et salon pour un utilisateur + en se basant sur son host. C'est utile si vous voulez différents motd pour différentes langues. + Le tld::mask est un masque user@host auquel l'username et l'host de l'utilisateur doivent + correspondre. Les tld::motd, tld::shortmotd, et tld::rules spécifie respectivement + les fichiers motd, shortmotd et rules qui doivent être affichés pour un hostmask. + Le tld::shortmotd est optionnel. tld::channel spécifie respectivement les fichiers motd, + shortmotd et rules qui doivent être affichés pour un hostmask. Le tld::shortmotd est optionnel. + Le bloc tld::options vous permet de définir des exigences supplémentaires, habituellement + seuls tld::options::ssl qui affiche seulement le fichier pour les usagers SSL, et tld::options::remotes + qui affiche seulement le fichier pour les utilisateurs étrangers existent.

    +

    Les entrées TLD sont vérifiées de haut en bas.

    +

    Exemple:
    +

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

    +

    +

    4.13 - Ban Nick Block + OPTIONNEL (connu précédemment comme Q:Line)

    +

    +

    Syntaxe:
    +

    ban nick {
    + mask <nickname>; + reason <reason-for-ban>; +};

    +

    Le ban nick block vous permet d'interdire l'utilisation d'un pseudo sur le serveur. + Le ban::mask permet à des masques avec joker de correspondre à plusieurs pseudos, et + ban::reason vous permet de spécifier la raison pour laquelle ce ban a été placé. + Le plus souvent ces blocs sont utilisés pour bannir l'usage de pseudos généralement + utilisés par des services réseaux.

    +

    Exemple:
    +

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

    +

    +

    4.14 - Ban User Block + OPTIONNEL (connu précédemment comme K:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Ce bloc vous permet de bannir un masque user@host à sa connexion au serveur. + Le ban::mask est une version avec joker du user@host à bannir, et ban::reason est la raison pour + laquelle ce ban a été placé. Notez que ceci est uniquement un ban local et l'utilisateur peut + toujours se connecter à un autre serveur pour rejoindre le réseau.

    +

    Exemple:
    +

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

    +

    +

    4.15 - Ban IP Block + OPTIONNEL (connu précédemment comme Z:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Le ban ip block banni une IP lorsqu'il se connecte au serveur. Cela inclus aussi bien les + utilisateurs que les serveurs qui essayent de se connecter. Le paramètre ban::mask est un IP + pouvant contenir un joker, et ban::reason est la raison pour laquelle ce ban a été placé. + Depuis que ce ban affecte les serveur il doit être utilisé très prudemment.

    +

    Exemple:
    +

    ban ip {
    +	mask 192.168.1.*;
    +	reason "Get a real ip u lamer!";
    +};

    +

    +

    4.16 - Ban Server Block + OPTIONNEL (connu précédemment comme q:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Ce bloc retire la possibilité d'un serveur de se connecter au réseau. Si le serveur se link directement + à votre serveur, le link sera rejeté. Si le serveur se link à un autre serveur, le serveur local se + déconnectera du réseau. Le champ ban::mask spécifie un masque avec joker à confronter au nom du serveur + tentant de se connecter, et ban::reason spécifie la raison pour laquelle ce ban a été placé.

    +

    Exemple:
    +

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

    +

    +

    4.17 - Ban RealName Block + OPTIONNEL (connu précédemment comme n:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Le ban realname block vous permet de bannir un client basé sur le champs GECOS (realname). + Cela est utilisé pour les flood de clones car souvent les bots clones utilisent le même realname. + Le ban::mask spécifie le realname devant être banni. Le masque peut contenir un joker. + Le ban::reason spécifie pour ce ban a été placé.

    +

    Exemple:
    +

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

    +

    +

    4.18 - Ban Version Block + OPTIONNEL

    +

    +

    Syntaxe:
    +

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

    +

    Le ban version block vous permet de bannir un utilisateur pour l'utilisation du client IRC qu'il utilise. + Ceci se base sur la réponse au CTCP version envoyé au client. Il est donc bien entendu que si le + client n'envoie pas de réponse au CTCP version, le ban ne fonctionnera pas. Cette fonction doit vous + permettre de bloquer des scripts dangereux. Le ban::mask spécifie la version devant être bannie. + Le mask peut contenir un joker. Le ban::reason spécifie la raison pour laquelle le ban a été placé. + Vous pouvez également spécifier ban::action, kill est la valeur par défaut, + tempshun shunera uniquement la connexion de l'utilisateur et devrait fonctionner très efficacement + contres les bots/zombies avec des IPs dynamiques car il n'affectera pas les utilisateurs innocents. + shun/kline/zline/gline/gzline placeront un ban de ce type sur l'ip (*@IPADDR), la durée de ce ban + peut être configurée avec set::ban-version-tkl-time et est de 1 jour par défaut.

    +

    Exemples:
    +

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

    +

    +

    4.19 - Ban Exceptions Block + OPTIONNEL (connu précédemment comme E:Line)

    +

    +

    Syntaxe:
    +

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

    +

    L'except ban block vous permet de spécifier un user@host qui outrepassera un ban placé sur une plage de host. + Ceci est très utile lorsque vous voulez bannir un FAI, mais que vous voulez que certains utilisateurs + spécifiques puissent toujours se connecter. La directive except::mask spécifie le masque user@host + du client qui sera autorisé à se connecter.

    +

    Exemple:
    +

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

    +

    +

    4.20 - TKL Exceptions Block + OPTIONNEL

    +

    +

    Syntaxe:
    +

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

    +

    L'except tkl block vous permet de spécifier un user@host qui pourra outrepasser un ban tkl + placé sur une plage de host. Ceci est très utile lorsque vous voulez bannir un FAI, mais que + vous voulez que certains utilisateurs spécifiques puissent toujours se connecter. La directive + except::mask spécifie le masque user@host du client qui sera autorisé à se connecter. + L' except::type spécifie quel type de ban pourra être outrepassé. Les types valides sont + gline, gzline, qline, gqline et shun qui feront une exception pour les Glines, Global Zlines, + Qlines, Global Qlines, et shuns.

    +

    Exemple:
    +

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

    +

    +

    4.21 - Throttle Exceptions Block + OPTIONNEL +

    +

    Syntaxe:
    +

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

    +

    L'except throttle block vous permet de spécifier une IP qui pourra outrepasser le throttling system. + Ceci fonctionne uniquement si vous avez choisi d'activer le throttling. L'except::mask spécifie l'IP + qui ne sera pas bannie à cause du throttling.

    +

    Exemple
    +

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

    +

    +

    4.22 - Deny DCC Block + OPTIONNEL (connu précédemment comme dccdeny.conf) +

    +

    Syntaxe:
    +

    deny dcc {
    +	filename <file-to-block>;
    +	reason <reason-for-ban>;
    +	soft [yes|no];
    +};

    +

    Le deny dcc block vous permet de spécifier un nom de fichier qui ne pourra être envoyé + par DCC via le serveur. Ceci est très utile pour aider à stopper la propagation de + virus et / ou trojans.

    +

    Le paramètre deny::filename spécifie un masque avec joker du nom de fichier à rejeter, + et deny::reason spécifie la raison pour laquelle ce fichier est bloqué.

    +

    Il existe aussi une option deny::soft ,si elle a la valeur 'yes' (oui) le dcc sera bloqué + à moins que l'utilisateur le permette explicitement via /DCCALLOW + pseudo-essayant-d'envoyer. + Regardez le dccallow.conf pour avoir un bon exemple de configuration pour dccallow.

    +

    Exemples
    +

    deny dcc {
    +	filename virus.exe;
    +	reason "This is a GD Virus";
    +};
    +
    +deny dcc {
    +	filename "*.exe";
    +	reason "Executable content";
    +	soft yes;
    +};
    +

    +

    +

    4.23 - Deny Version Block + OPTIONNEL (connu précédemment comme V:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Ce bloc vous permet d'interdire à un serveur de se linker en fonction de la version + d'Unreal qu'il utilise et quelle option de compilation il a. Le format pour ce bloc + est un peu complexe mais il n'est pas trop difficile à comprendre. La directive deny::mask + spécifie le nom du serveur avec joker auquel il s'applique. Le deny::version spécifie le + numéro de protocole de la version auquel on fait référence.

    +

    Par exemple, 3.0 d'où 2301, 3.1.1/3.1.2 d'où 2032, 3.2 d'où 2303. Le premier + caractère de ce paramètre peut être un des suivant >, <, =, !. Ce caractère + dit à l' IRCd comment interpréter la version. Si ce caractère est un > + alors toutes les versions supérieures à celle spécifiée seront interdites, Si c'est un < + toutes les versions inférieures seront interdites, si c'est un = seulement cette version sera interdite, + et si c'est un ! alors toutes les versions seront interdites excepté celle spécifiée. La directive + deny::flags vous permet de spécifier que compile time flag le serveur doit ou ne doit pas avoir. + Les flags sont arrangé l'un après l'autre sans séparation entre eux, si un caractère est précédé d'un ! + alors cela signifiera que le serveur ne pourra pas être compilé avec ce flag, si il n'y a pas de préfixe !, + alors cela signifiera que le serveur devra être compilé avec ce flag.

    +

    +

    4.24 - Deny Link Block + OPTIONNEL (connu précédemment comme D/d:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Ce bloc vous permets d'utiliser des règles spécifiques pour interdire le link d'un serveur. + Le deny::mask spécifie un nom de serveur avec joker auquel cette règle s'applique. + La directive deny::rules est très complexe. Une expression crule vous permet de contrôler + le link en détail, et il se règle comme un programme. Quatre opérateurs sont supportés, + connected(<servermask>), retourne vrai si un serveur correspondant au + servermask est connecté, directcon(<servermask>), etourne vrai si un serveur + correspondant au servermask est directement connecté à ce serveur, + via(<viamask>,<servermask>), retourne vrai si un serveur correspondant au + servermask est connecté à partir d'un serveur correspondant au viamask, et directop(), + qui retourne vrai si l'IRCOP utilisant /connect est directement connecté sur ce serveur. + Ces opérateurs peuvent être combinés en utilisant && (et) et || (ou), les items + peuvent également être mis entre parenthèses pour permettre le regroupement. De plus, un + opérateur précédé d'un ! vérifier si l'opérateur retourne faux. Si l'expression est évaluée + comme entièrement vraie, alors le link est refusé. Le deny::type permet deux valeurs différentes, + auto (s'applique uniquement aux autoconnexions, /connect fonctionnera toujours), et all + (s'applique à toutes les tentatives de connections).

    +

    +

    4.25 - Deny Channel Block + OPTIONNEL (connu précédemment comme chrestrict.conf) +

    +

    Syntaxe:
    +

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

    +

    +

    Le deny channel block vous permet d'interdire aux utilisateurs de rejoindre un salon. + La directive deny::channel spécifie le nom d'un salon avec joker que les utilisateurs + ne pourront rejoindre, et le deny::reason spécifie la raison pour laquelle le salon + ne peut être rejoint. De plus, vous pouvez spécifier un deny::redirect. Si celui-ci est + spécifié, lorsqu'un utilisateur essaye de rejoindre un salon correspondant à un deny::channel, + il ou elle sera redirigé(e) vers deny::redirect. Et il y a également deny::warn + qui (si il est activé) enverra une opernotice (au EYES snomask) si un utilisateur essaye de rejoindre le salon. +

    +

    Exemples

    +
    deny channel {
    +	channel "#unrealsucks";
    +	reason "No it don't!";
    +};
    +
    +deny channel {
    +	channel "#*teen*sex*";
    +	reason "You == dead";
    +	warn on;
    +};
    +
    +deny channel {
    +	channel "#operhelp";
    +	reason "Our network help channel is #help, not #operhelp";
    +	redirect "#help";
    +};

    + +

    +

    4.26 - Allow Channel Block + OPTIONNEL +

    +

    Syntaxe:
    +

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

    +

    Le allow channel block vous permet de spécifier des salons spécifiques que les utilisateurs pourront joindre. + La directive allow::channel spécifie les noms de salon avec joker pouvant être rejoint.

    +

    Exemple:
    +

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

    +

    +

    4.27 - Allow DCC Block + OPTIONNEL +

    +

    Syntaxe:
    +

    allow dcc {
    +	filename "<filename-mask>";
    +	soft [yes|no];
    +};

    +

    Le allow dcc block vous permet de spécifier des exceptions au deny dcc block, + les jokers sont permis. Si allow dcc::soft est mis à 'yes' il applique la liste + des 'soft dcc bans', si il est mis à 'no' il applique la listes des dcc bans normaux ('hard').

    +

    Exemple:
    +

    allow dcc {
    +	filename "*.jpg"; /* Images are usually safe */
    +	soft yes;
    +};

    +

    +

    4.28 - Vhost Block + OPTIONNEL (connu précédemment comme vhosts.conf) +

    +

    Syntaxe:
    +

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

    +

    Le vhost block vous permet de spécifier un login/mot-de-passe pouvant être utilisé avec + la commande /vhost pour obtenir un faux hostname. Le paramètre vhost::vhost peut être un + user@host ou juste un host que l'utilisateur recevra après un /vhost réussi. Le vhost::from::userhost + contient un user@host auquel l'utilisateur doit correspondre pour être éligible pour un vhost. Vous + pouvez spécifier plus d'un hostmask. Le vhost::login est le login que l'utilisateur doit rentrer + et vhost::password est le mot de passe devant être entré. Le vhost::password:: vous permet de spécifier + le type d'authentification utilisé par cet item. Les types d'authentification actuellement supportés + sont crypté, md5 et sha1, ripemd-160. Finallement, vhost::swhois vous permet d'ajouter un ligne + supplémentaire au whois des utilisateurs, exactement comme dans le oper block oper::swhois.

    +

    Exemple:
    +

    vhost {
    +	vhost my.own.personal.vhost.com;
    +	from {
    +		userhost my@isp.com;
    +		userhost myother@isp.com;
    +	};
    +	login mynick;
    +	password mypassword;
    +	swhois "Im Special";
    +};

    +

    +

    4.29 - Badword Block + OPTIONNEL (connu précédemment comme badwords.*.conf) +

    +

    Syntaxe:
    +

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

    +

    Le badword block vous permet de manipuler la liste utilisée pour le mode utilisateur + et salon +G pour cacher les 'mauvais mots'. Le badword:: spécifie le type, les types + valides sont channel, message, quit et all. Channel est pour la liste des salons +G, message + est pour la liste des utilisateurs +G, quit est pour la censure des messages de quit et all + est pour ajouter les trois listes. Le badword::word peut être un simple mot ou une expression + régulière que nous pouvons chercher. Le badword::replace est ce par quoi doit être remplacé + le mot correspondant. Si badword::replace n'est pas spécifié, le mot est remplacé + par <censored>. Le badword::action défini quelle action doit être réalisée si un mauvais + mots est trouvé. Si vous spécifiez replace, alors le mauvais mots est remplacé, si vous spécifez + block, le message entier sera bloqué. Si vous ne spécifiez pas un badword::action, le mot sera remplacé.

    +

    Exemple:
    +

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

    +

    +

    4.30 - ULines Block + OPTIONNEL (connu précédemment comme the U:Line)

    +

    +

    Syntaxe:
    +

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

    +

    Le ulines block vous permet d'accorder à certains serveurs des possibilités supplémentaires. + Ceci doit uniquement être utilisé pour des serveurs comme les services et les stats. + Ceci ne doit pas être appliqué à un serveur normal. Chaque entrée est le nom du serveur qui + recevra les possibilités supplémentaires.

    +

    Exemple
    +

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

    +

    +

    4.31 - Link Block + OPTIONNEL (connu précédemment comme C/N/H:Lines) +

    +

    Syntaxe:
    +

    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>;
    +	ciphers <ssl-ciphers>;
    +	options {
    +		<option>;
    +		<option>;
    +		...
    +	};
    +};

    +

    C'est le bloc dont vous avez besoin pour linker les serveurs, s'il vous plaît prenez le temps de + lire tout ceci car c'est l'une des parties les plus difficiles et les utilisateurs font souvent des erreurs. ;P

    +

    D'abord server-name est le nom du serveur distant, le nom que le serveur distant a dans son bloc me { }, + tel que hub.blah.com (pas l'ip et peut être différent de l'hostname).

    +

    username
    + Vous pouvez le spécifier si vous utilisez l'ident pour l'authentification,normalement vous mettrez "*". +

    +

    hostname
    + L'host ou l'ip du serveur distant. Ceci est utilisé pour la connexion et pour l'authentification / vérification + du coté entrant. Quelques exemples :
    + + + + + +
    1.2.3.4 IP normale
    hub.blah.com host: seulement pour sortie, ne peut accepter de connexion entrante sans + la présence de link::options::nohostcheck
    * ne peut pas se connecter mais accepte la connexion de n'importe quel serveur (avec le bon mot de passe)
    ::ffff:1.2.3.4 pour linker de l'ipv6 à de l'ipv4.
    +

    +

    bind-ip (optionnel)
    + Peut être utilisé pour spécifier un IP (ex. : 192.168.0.1) depuis lequel nous devons nous connecter, + presque jamais utilisé. +

    +

    port
    + Port auquel on se connecte (celui que le serveur distant écoutera). +

    +

    password-connect
    + Le mot de passe utilisé pour se connecter au serveur distant, doit être écrit en clair. +

    +

    password-receive
    + Le mot de passe utilisé pour valider les links entrants, peut être encrypté + (les méthodes d'encryptions valides sont crypt, md5, sha1, ripemd-160). + Vous pouvez laisser le paramètre auth-type décrypté. Souvent, il est le même que le password-connect. +

    +

    hub vs leaf
    + Un hub a plusieurs serveurs linké à lui, un leaf n'a qu'un seul link... le vôtre. + Un serveur est soit un hub, soit un leaf, vous ne pouvez combiner ces options. +

    +

    hub (optionnel)
    + Cette valeur est un masque des serveurs auquel ce hub peut se connecter (ex. : *.my.net). +

    +

    leaf (optionnel)
    + Cette valeur est un masque que ce serveur interprétera comme un leaf. +

    +

    leaf-depth (optionnel)
    + Si celui-ci est spécifier, alors leaf doit l'être aussi. + Cette valeur spécifie la profondeur (nombre de sauts) que ce serveur peut avoir derrière lui. +

    +

    class
    + La classe dont ce serveur fait partie, souvent une classe de serveurs séparés est utilisé pour ceci. +

    +

    compression-level (optionnel)
    + Spécifie le taux de compression (1-9) pour ce link. Seulement utilisé si link::options::zip est activé. +

    +

    ciphers (optionnel)
    + Specifie le SSL ciphers a utiliser pour ce link. Pour obtenir une liste de ciphers disponibles, utilisez + la commande `openssl ciphers`. Les ciphers doivent être spécifiés comme : une liste séparée. +

    +

    options block
    + Une ou plusieurs options utilisées pour se connecter à ce serveur. Parfois pas requises.
    + + + + + + + +
    ssl si vous êtes connecté à un port ssl.
    autoconnect le serveur essayera de se connecter automatiquement, le temps est + spécifié dans votre class::connfreq (il est mieux d'activer ceci seulement dans un sens, comme leaf->hub)
    zip si vous voulez des links compressés, vous devez compiler les deux serveurs concernés avec l'option zip activé
    nodnscache ne pas cacher l'ip pour les connexions des serveurs sortants, utilisez cela + pour des serveurs dont l'host change souvent (comme dyndns.org)
    nohostcheck ne pas valider l'host distant (link::hostname), utilisez cela pour des + serveurs dont l'host change souvent (comme dyndns.org)
    quarantine les opers sur ce serveur conserveront le status de locop.
    +

    +

    Exemple:

    +
    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.32 - Alias Block + OPTIONNEL +

    +

    Syntaxe [standard alias]:
    +

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

    +

    (Note: reportez-vous également ici à propos des fichiers d'alias standards d'UnrealIRCd)

    +

    L'alias block (alias standards) vous permet de transmettre une commande à un + utilisateur, par exemple /chanserv envoie un message à l'utilisateur chanserv. + L' alias:: spécifie le nom de la commande qui sera l'alias (ici : chanserv), + alias::target est le pseudo ou le salon à qui il sera envoyé, si l' alias:: est + le même que la cible à qui il sera envoyé alias::target peut ne pas être rempli. + L' alias::type spécifie le type d'alias, les types valides sont services + (l'utilisateur est sur le serveur des services), stats (l'utilisateur est sur le + serveur de statistiques), normal (la cible est sur n'importe quel serveur). + L'alias block a également une autre utilité expliqué ci-dessous.

    +

    Syntaxe [command alias]:
    +

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

    +

    Lorsque l'alias block est utilisé dans ce format, il vous permet une plus vaste plage d'usage. + Par exemple, vous pouvez créer des alias tels que /identify. L' alias:: est comme ci-dessus, + le nom de l'alias de commande. L' alias::format spécifie une expression régulière comparée au + texte envoyé à l'alias de commande, si l'entrée correspond à l' alias::format elle sera utilisée, + vous pouvez définir plusieurs alias::format qui feront faire différentes choses à la commande suivant + la syntaxe utilisée. L'alias::format::target est la cible à qui envoyer cette commande. + L' alias::format::type spécifie le type d'alias devant être transmit. L'alias::format::parameters + est ce qui sera envoyé à cet alias en tant que paramètre. Pour spécifier un des paramètres donné à + l'alias de commande, spécifiez % suivi d'un nombre, par exemple %1 est le premier paramètre. + Pour spécifier tous les paramètres depuis un paramètre donné jusqu'à la fin, mettez % suivi par + le nombre et un -, par exemple %2- retourne tous les paramètres depuis le deuxième jusqu'au dernier. + De plus, vous pouvez spécifier %n qui sera remplacé par le pseudo de l'utilisateur qui a tappé la commande. + Pour des exemples d'utilisation de l'alias block dans le format de commande, consultez le doc/example.conf.

    +

    +

    4.33 - Help Block + OPTIONNEL +

    +

    Syntaxe:
    +

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

    +

    (Note: normalement vous ajoutez seulement l'help.conf)

    +

    L'help block vous permet des créer des entrées à utiliser dans /helpop. + L' help:: est la valeur qui doit être interprétée comme paramètre dans /helpop, + si l'help:: est laissé vide, alors il sera utilisé lorsqu'aucun paramètre n'est + précisé dans /helpop. Les entrées pour l'help block sont les textes qui seront affiché + lorsque l'utilisateur demandera l' /helpop.

    +

    + +

    4.34 - Official Channels Block + OPTIONNEL +

    +

    Syntaxe:
    +

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

    +

    Les salons officiels sont affichés dans la /list même si aucun utilisateurs n'y sont. + Le topic est optionnel et est montré dans la /list si il y a 0 utilisateur. +

    + +

    Exemple:
    +

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

    +
    + +

    4.35 - Spamfilter Block + OPTIONNEL +

    +

    +Le spamfilter block vous permet d'ajouter un filtre anti-spam local (pas au niveau du réseau).
    +Voir Features - Spamfilter pour plus d'information à propos des filtres anti-spam.
    +

    +

    Syntaxe:
    +

    spamfilter {
    +	regex <word>;
    +	target { <target(s)> };
    +	action <action>;
    +	reason <reason>;
    +	ban-time <time>;
    +};

    +

    regex est le regex auquel on doit correspondre.
    + target spécifie les cibles, reportez-vous ici pour obtenir la liste des types disponibles (ex: 'channel').
    + action spécifie l'action à effectuer, reportez-vous ici pour obtenir la liste des types disponibles (ex: 'gline')
    + reason optionnel : spécifie la raison du ban ou du blocage, sinon la raison par défaut est utilisée.
    + ban-time optionnel : spécifie la durée d'un ban *line, sinon la valeur par défaut est utilisée (1 jour).
    +

    + +

    Exemples:
    +

    spamfilter {
    +	regex "Come watch me on my webcam";
    +	target { private; channel; };
    +	action gline;
    +	reason "You are infected, please go to www.antivirus.xx/blah/virus=GrrTrojan";
    +	ban-time 6h;
    +};
    +
    +spamfilter {
    +	regex "come to irc\..+\..+";
    +	target { private; channel; };
    +	action gline;
    +	action gline;
    +	reason "No spamming allowed";
    +};
    +

    +
    + +

    4.36 - Set Block + OBLIGATOIRE (connu précédemment comme unrealircd.conf/networks file) +

    +

    Le fichier set est ce qui est utilisé en tant que notre networks/unrealircd.conf et notre + fichier networks. Sur les réseaux d'un seul serveur, plutôt que d'avoir 3 fichiers vous pouvez + tout mettre dans l'unrealircd.conf lui même, sur les réseaux multi-serveurs, je vous recommande + d'utiliser des fichiers networks séparés.

    +

    Maintenant, si votre serveur est sur un réseau, il y a des chances pour que vous utilisiez + basiquement les mêmes réglages Set. Dans ce cas, il est plus logique d'avoir un fichier network, + qui est chargé avec une directive include. + Ci-dessous, vous trouverez toutes les directives set disponibles.

    +

    Dans cette documentation, nous nous référons aux réglages / directives sous la forme + <block-name>::<block-directive> Ce format N'est PAS le format pouvant être + entré dans le fichiers de configuration. IL DOIT être converti dans le format listé ci-dessous. + Il est présenté dans un format qui le rend plus simple à expliquer.

    +

    Syntaxe:
    +

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

    +

    Le set block appliques des options pour les réglages d'un serveur individuel. Chaque entrée + fait quelque chose de différent et elles seront toutes décrites ci-dessous. Certaines directives + ont des sous blocs qui seront également décrits. Il y a beaucoup de intitulés réglages à couvrir, + toutes les directives listées ci-dessous peuvent être incluses sous UN intitulé. Si une directive + a des options, elles seront incluses dans l'intitulé de réglages au mieux.
    + Exemple:
    +

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

    +

    Maintenant si vous voulez faire les intitulés de réglages séparément, + dites que vous voulez régler vos options sur une simple ligne.
    + Exemple:
    + set { options { hide-ulines; no-stealth; }; };
    +

    +

    set::kline-address <email-address>;
    + L'adresse email à laquelle doivent être envoyés les questions sur les K:line. + Cette valeur doit être spécifiée.

    +

    set::modes-on-connect <+modes>;
    + Les modes qui seront appliqués à un utilisateur à la connexion.

    +

    set::snomask-on-connect <+modes>
    + Les snomask qui seront appliqués à un utilisateur à la connexion.

    +

    set::modes-on-oper <+modes>;
    + Les modes qui seront appliqués à un utilisateur lorsqu'il s' /oper.

    +

    set::snomask-on-oper <+modes>;
    + Les snomask qui seront appliqués à un utilisateur lorsqu'il s' /oper.

    +

    set::modes-on-join <+modes>;
    + Les modes qui seront appliqués à un salon lors de sa création. + Tous les modes ne peuvent pas être utilisés par cette commande. + +qaohvbeOAzlLk ne peuvent être appliqués par cette commande.

    +

    set::restrict-usermodes <modes>
    + Empêche les utilisateurs d'appliquer / enlever les modes listés ici (n'utilisez pas + ou -). + Par exemple, vous pouvez mettre le +G en modes-on-connect et G en restrict-usermodes, + de cette façon vous obligez tous les utilisateurs à avoir le mode +G et les empêcher + de se mettre en -G.

    +

    set::restrict-channelmodes <modes>
    + Empêche les utilisateurs d'appliquer / enlever les modes de salon listés ici (n'utilisez pas + ou -). + Par exemple, vous pouvez mettre le +G en modes-on-connect et G en restrict-channelmodes, + de cette façon vous obligez tous les (nouveaux) salons à avoir le mode +G et les empêcher de se mettre en -G.
    + NOTE : il peut toujours être possible d'utiliser ces modes de salon sans passer par les + services en utilisant MLOCK. Malheureusement nous ne pouvons pas en faire plus à ce propos, vous + devrez le demander aux codeurs de vos services d'implémenter une option restrict-channelmodes également.

    +

    set::restrict-extendedbans <types|*>
    + Ne permet pas aux utilisateurs d'utiliser des bans étendus ("*") ou en empêche certains (ex. : "qc").

    +

    set::auto-join <channels>;
    + Les salons qu'un utilisateur est forcé de rejoindre à la connexion. + Pour spécifier plus d'un salon, utilisez une virgule pour les séparer.
    + [Note : n'oubliez pas d'ajouter des quotes comme : auto-join "#chan";]

    +

    set::oper-auto-join <channels>;
    + Le(s) salon(s) qu'un utilisateur sera forcé de rejoindre après /oper. + Pour spécifier plus d'un salon, utilisez une virgule pour les séparer.
    + [Note: n'oubliez pas d'ajouter des quotes comme : oper-auto-join "#chan";]

    +

    set::anti-spam-quit-message-time <timevalue>;
    + Cette valeur de temps spécifie la durée minimale pendant laquelle l'utilisateur + doit être connecté avant de pouvoir afficher un message /quit. Utilisé pour prévenir le spam. + Une valeur de temps est une valeur numérique avec d pour jour, h pour heure, m pour minutes, + et s pour secondes, par exemple 1d2h3m signifie 1 jour, 2 heures, 3 minutes.

    +

    set::prefix-quit <text-to-prefix-quit>;
    + Défini le texte qui sera affiché devant le message de quit. + Si la valeur est 0, alors le texte standard "Quit:" sera appliqué.

    +

    set::static-quit <quit message>;
    + Défini le message de quit qui sera envoyé quel que soit le message envoyé par + le client lorsqu'il quitte le réseau. Ceci élimine le besoin de recourir à + l'anti-spam-quit-message-time, ainsi que le set::prefix-quit. Cela NE remplacera + PAS les ERREURS par le message static-quit.

    +

    set::static-part <no|yes|part message>;
    + Le 'yes' empêchera tous les commentaires de part, le 'no' laissera fonctionner + les part comme d'habitude, n'importe quoi d'autre sera utilisé comme commentaire + de part (ex. : static-part "Bye!") mais ca peut être assez ennuyeux, alors utilisez le prudemment.

    +

    set::who-limit <limit>;
    + Défini le nombre maximum de réponses retournées lors d'un /who. + Si cette option n'est pas spécifiée, il n'y aura pas de limite.

    +

    set::silence-limit <limit>;
    + Défini le maximum d'entrées dans la SILENCE list. + Si la directive n'est pas spécifiée, une limite de 15 sera appliquée.

    +

    set::oper-only-stats <stats-list>;
    + Spécifie une liste de flags stats sans séparateur qui défini les flags stats + que seuls les opérateurs pourront utiliser. Ne donnez pas de valeur si vous + voulez permettre aux utilisateurs d'utiliser tous les flags, ou spécifiez * + pour que les utilisateurs ne puissent en utiliser aucun. Seul les flags stats + cours peuvent être spécifiés ici.

    +

    set::oper-only-stats {<stats-flag>; <stats-flag>;};
    + Spécifie une liste de flags stats pouvant être utilisés uniquement par les opérateurs. + Ceci ne marche qu'avec les flags stats longs.

    +

    set::maxchannelsperuser <amount-of-channels>;
    + Spécifie le nombre de salons sur lesquels un simple utilisateur peut être en même temps.

    +

    set::maxdccallow <amount-of-entries>;
    + Spécifie le nombre maximum d'entrées qu'un utilisateur peut avoir dans son / sa list DCCALLOW.

    +

    set::channel-command-prefix <command-prefixes>;
    + Spécifie le caractère de préfixe pour les services dans les "commandes de salons". + Les messages commençant par le caractère spécifié seront envoyé même si le client est en +d. + La valeur par défaut est "`".

    +

    set::allow-userhost-change [never|always|not-on-channels|force-rejoin]
    + Spécifie ce qu'il arrive quand un user@host change (+x/-x/chghost/chgident/setident/vhost/etc).
    + never supprime toutes les commandes, always le permet toujours même si + le client est sur un salon (peut causer le desync du client) [défaut] not-on-channels + le permet uniquement si l'utilisateur n'est sur aucun salon, force-rejoin forcera à + rejoindre tous les salons avec re-op/voice/etc si nécessaire.

    +

    set::options::hide-ulines;
    + Si il est présent, Les serveurs avec Uline seront cachés dans une requête /links par les non-opers.

    +

    set::options::flat-map;
    + Si il est présent, tous les serveurs apparaîtrons comme directement linkés dans /map et /links, + ainsi vous ne pourrez plus voir quel serveur est linké directement au quel. C'est une petite aide + contre les attaque (D)DoS parce que les personnes mal-intentionnées ne peuvent plus voir + facilement les 'points faibles'.

    +

    set::options::show-opermotd;
    + Si il est présent, l'opermotd sera montré aux utilisateurs une fois qu'ils se seront /oper avec succès.

    +

    set::options::identd-check;
    + Si il est présent, la présence d'un serveur d'identd sera vérifiée et la valeur retournée + sera utilisée comme username. Si aucune requête d'ident n'est retournée ou si le serveur + d'identd n'existe pas, l'username de l'utilisateur spécifié sera préfixé d'un ~. + Si cette valeur est omise, aucune vérification ne sera faite.

    +

    set::options::show-connect-info;
    + Si il est présent, les notices "ident request", "hostname lookup", etc. + seront affichées à la connexion de l'utilisateur..

    +

    set::options::dont-resolve;
    + Si il est présent, les hosts des utilisateurs entrants ne seront pas résolus, + peut être utile si beaucoup de vos utilisateur n'ont pas d'host pour accélérer la connexion.
    + Notez que depuis que le 'non resolving' existe vous pouvez également avoir des allow blocks basés sur les hosts.

    +

    set::options::mkpasswd-for-everyone;
    + Fait en sorte que le /mkpasswd puisse être utilisé par tout le monde à la place des opers uniquement, + l'usage de cette commande par les non-opers est envoyé aux EYES snomask.

    +

    set::options::allow-part-if-shunned;
    + Permet aux utilisateurs shun d'utiliser /part.

    +

    set::dns::timeout <timevalue>;
    + Une valeur de temps spécifie la durée qu'un serveur DNS a pour répondre. + Une valeur de temps est un numérique avec d pour jour, h pour heure, + m pour minutes, et s pour secondes, par exemple 1d2h3m signifie 1 jour, 2 heures, 3 minutes.

    +

    set::dns::retries <number-of-retries>;
    + Une valeur numérique spécifie le nombre de fois que la résolution de DNS reprendra en cas d'échec.

    +

    set::dns::nameserver <name-of-dns-server>;
    + Spécifie l'hostname du serveur qui sera utilisé pour la résolution de DNS.

    +

    set::network-name <name-of-network>;
    + Spécifie le nom du réseau sur lequel ce serveur tourne. + Cette valeur devrait être exactement la même sur tous les serveurs d'un réseau.

    +

    set::default-server <server-name>;
    + Défini le nom au serveur par défaut à indiquer aux utilisateurs pour se + connecter si celui-ci est remplis.

    +

    set::services-server <server-name>;
    + Spécifie le nom du serveur auquel les services sont connectés. Obligatoire, + définissez le avec quelquechose comme services.yournet.com si vous n'avez pas de services.

    +

    set::stats-server <server-name>;
    + Établis le nom du serveur sur lequel le bot de statistique est présent.Si aucun service de + statistique n'est lancé, cette valeur peut être ignoré.

    +

    set::help-channel <network-help-channel>;
    + Spécifie le nom du channel d'aide du réseau.

    +

    set::cloak-keys { "key1"; "key2"; "key3"; };
    + Spécifie les clés qui seront utilisés pour générer les +x hosts. + Cette valeur doit être la même sur tous les serveurs d'un réseau. + Si ce n'est pas le cas, les serveurs ne pourront plus linker. + Les 3 set::cloak-keys:: doivent être des strings de 5 à 100 caractères + (10 à 20, c'est bien), elles doivent contenir des lowercases (a-z), + des uppercases (A-Z) et des chiffres (0-9). Noter que cela dépend du module + de cloaking que vous utilisez, d'autres règles peuvent être appliquées.

    +

    set::hiddenhost-prefix <prefix-value>;
    + Définis le préfix qui sera utilisé dans les hiddenhosts (+x). + Il est composé généralement de trois ou quatre lettres qui représente le nom du réseau.

    +

    set::hosts::local <locop-host-name>;
    + Définie l'hostname qui sera assigné aux opérateurs locaux quand ils se mettent le umode +x. + Vous pouvez optionnellement specifier un username@host pour cette valeur.

    +

    set::hosts::global <globop-host-name>;
    + Définie l'hostname qui sera assigné aux opérateurs globaux quand ils se mettent le umode +x. + Vous pouvez optionnellement specifier un username@host pour cette valeur.

    +

    set::hosts::coadmin <coadmin-host-name>;
    + Définie l'hostname qui sera assigné aux co-admins quand ils se mettent le umode +x. + Vous pouvez optionnellement specifier un username@host pour cette valeur.

    +

    set::hosts::admin <admin-host-name>;
    + Définie l'hostname qui sera assigné aux admins quand ils se mettent le umode +x. + Vous pouvez optionnellement specifier un username@host pour cette valeur.

    +

    set::hosts::servicesadmin <servicesadmin-host-name>;
    + Définie l'hostname qui sera assigné aux services-admins quand ils se mettent le umode +x. + Vous pouvez optionnellement specifier un username@host pour cette valeur.

    +

    set::hosts::netadmin <netadmin-host-name>;
    + Définie l'hostname qui sera assigné aux netadmins quand ils se mettent le umode +x. + Vous pouvez optionnellement specifier un username@host pour cette valeur.

    +

    set::hosts::host-on-oper-up <yes/no>;
    + Si vous mettez yes, le flag H/get_host sera honoré et le umode +x sera automatiquement + mis quand vous vous /oper. Si vous mettez no, l'utilisateur doit se mettre le umode +x + manuellement pour recevoir l'oper host.

    +

    set::ssl::egd <filename>;
    + Spécifie que le support de l'EGD (Entropy Gathering Deamon) devrait être activé. + Si vous utilisez OpenSSL 0.9.7 ou une version postérieure, alors /var/run/egd-pool, + /dev/egd-pool, /etc/egd-pool, et /etc/entropy seront recherchés par défaut donc aucun + nom de fichier n'est nécessaire, vous pouvez simplement spécifier set::ssl::egd sans valeur. + Si vous utilisez une version d'OpenSSL antérieure à la 0.9.7 ou vous voulez utiliser + un socket EGD placé ailleurs que dans la liste des emplacements listés ci-dessus, + vous pouvez spécifier le nom de fichier de l'UNIX Domain Socket qu'un EGD écoute.

    +

    set::ssl::certificate <filename>;
    + Spécifie le nom de fichier où le certificat SSL du serveur est situé.

    +

    set::ssl::key <filename>;
    + Spécifie le nom de fichier où la clé privée SSL du serveur est située.

    +

    set::ssl::trusted-ca-file <filename>;
    + Spécifie le nom de fichier où les certificats du trusted CAs sont situés.

    +

    set::ssl::options::fail-if-no-clientcert;
    + Force les clients n'ayant pas de certificat a être refusé.

    +

    set::ssl::options::no-self-signed;
    + N'autorise par de connexion en provenance de personne ayant des certificats auto-signés.

    +

    set::ssl::options::verify-certificate;
    + Fais qu' Unreal détermine si le certificat SSL est valide avant d'accepter la connexion.

    +

    set::throttle::period <timevalue>
    + Combien de temps un utilisateur doit attendre avant de ce reconnecter.

    +

    set::throttle::connections <amount>;
    + Combien de fois un utilisateur doit se connecter avec le même host pour être throttled. ( stoppé )

    +

    set::ident::connect-timeout <amount>;
    + Nombre de secondes avant de renoncer à la connexion au serveur d'ident (défaut : 10s).

    +

    set::ident::read-timeout <amount>;
    + Nombre de secondes avant de renoncer à une réponse (défaut : 30s).

    +

    set::anti-flood::unknown-flood-bantime <timevalue>;
    + Spécifie combien de temps une connexion inconnue d'un floodeur est bannie.

    +

    set::anti-flood::unknown-flood-amount <amount>;
    + Spécifie la quantité de données (en KiloBytes) que la connexion inconnue + doit envoyer pour que l'utilisateur soit killé.

    +

    set::anti-flood::away-flood <count>:<period>
    + Protection contre le flood d'away : limite le nombre de /away par périodes en secondes. + Ceci réclame que le NO_FLOOD_AWAY soit activé dans le config.h. Exemple : away-flood 5:60s; + signifie maximum 5 changements en 60 secondes.

    +

    set::anti-flood::nick-flood <count>:<period>
    + Protection contre le NickFlood : limite le nombre de changements de pseudo par + périodes en secondes. Par exemple nick-flood 4:90 + signifie 4 en 90 secondes, le défaut est 3 en 60 secondes.

    +

    set::default-bantime <time>
    + Le bantime par défaut quand vous faites /kline, /gline, /zline, /shun, etc sans paramètre + de temps (comme /gline *@some.nasty.isp), par défaut, celui ci est permanent (0). + Exemple: default-bantime 90d;

    +

    set::modef-default-unsettime <value>
    + Pour le chmode +f vous pouvez spécifier un unsettime par défaut, si vous spécifiez 10 par exemple, + alors +f [5j]:15 sera transformé en [5j#i10]:15. La valeur par défaut est pas d'unsettime par défaut.

    +

    set::modef-max-unsettime <value>
    + Le nombre maximum de minutes pour un mode +f unsettime (in +f [5j#i

    +

    set::ban-version-tkl-time <value>
    + Si vous spécifiez une 'action' like zline/gline/etc dans les ban version, alors vous pouvez + spécifier ici combien de temps l'ip va être bannie, par défaut, ceci est établi à 86400 (1 jour).

    +

    set::spamfilter::ban-time <value>
    + Même chose qu'au dessus mais pour les *lines ajoutés par le spamfilter

    +

    set::spamfilter::ban-reason <reason>
    + La raison utilisée pour l'ajout de *lines par le spamfilter

    +

    set::spamfilter::virus-help-channel <channel>
    + Le salon a utiliser pour l'action 'viruschan' dans le spamfilter

    +

    set::spamfilter::virus-help-channel-deny <yes|no>
    + Si vous mettez yes (ou "1") cela enverra "invite only" à tous les utilisateurs normaux + essayant de rejoindre le virus-help-channel. Seul les opérateurs, les personnes qui + résulte des spamfilters et les personnes qui sont /invite peuvent le rejoindre.

    +

    set::spamfilter::except <target(s)>
    + Ces cibles sont exemptés du spamfilter ( aucune action sera entrepris ), cela peut être + une simple cible, ou une liste séparé par des virgules. Ex: except "#help,#spamreport"

    +

    +

    5 – Fichiers additionnels +

    + En plus des fichiers de configuration, Unreal compte quelques autres fichiers comme MOTD, OperMOTD, BotMOTD et les règles (Rules). + Ci-dessous ce trouve la liste des fichiers et leurs utilités.
    + Notez que les fichiers motd (tous les types) et les fichiers de règles peuvent aussi être spécifiés + dans un tld block, ce sont juste les fichiers utilisés par défauts (et pour les remotes de MOTD / Rules).

      + + + + + + + + + + + + + + + + +
    ircd.motdAffiché lorsqu'un /motd est exécuté et (si ircd.smotd n'est pas présent) lorsqu'un utilisateur se connecte
    ircd.smotdAffiché à la connexion uniquement (MOTD court)
    ircd.rulesAffiché lorsqu'un /rules est exécuté
    oper.motdAffiché lorsqu'un /opermotd est exécuté ou lorsque vous tapez /oper
    bot.motdAffiché lorsqu'un /botmotd est exécuté
    +

    +

    6 – Modes des salons et des utilisateurs +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Mode
    Description
    Modes des salons
    A
    Seul les administrateurs peuvent rejoindre le salon
    a <nick>
    Rend l'utilisateur administrateur du salon
    b <nick!user@host>
    +
    Banni du salon l'utilisateur spécifié
    c
    Aucune couleur ANSI ne peut être envoyé sur le salon
    C
    Aucun CTCP n'est accepté sur le salon
    e <nick!user@host>
    Exception ban – L'utilisateur spécifié peut rejoindre le salon même + si il en est banni
    f * <lines:seconds>
    Flood protection, Si le * est spécifié, un utilisateur sera kickban + si il envoie <lines:seconds> si le * n'est pas spécifié, il sera juste kické
    G
    Contrôle les mots listés dans les Badword Blocks + et les remplace par les mots spécifiés.
    M
    Seul les utilisateurs dont le pseudo est enregistré (+r) peuvent parler sur le salon
    h <nick>
    Donne le statut de half-op à l'utilisateur
    i
    Le salon ne peut être rejoint que sous invitation
    K
    /knock n'est pas autorisé
    k <key>
    Attribue un mot de passe à spécifier pour rejoindre le salon
    l <##>
    Spécifie le nombre maximum d'utilisateurs
    L <Chan>
    Si le maximum spécifié par +l est atteint, les utilisateurs seront redirigés vers ce salon
    m
    Salon modéré. Seuls les utilisateurs +v/h/o peuvent parler
    N
    Aucun changement de pseudo n'est autorisé
    n
    Aucune message ne peut être envoyé de l'extérieur du salon
    O
    Seul les IRCops peuvent joindre le salon
    o <nick>
    Donne le statut d'opérateur à l'utilisateur
    p
    Rend le salon privé (n'apparaît plus dans la liste des salons)
    q <nick>
    Rend l'utilisateur « owner » (propriétaire) du salon
    Q
    Seul les U:Lined peuvent kicker les utilisateurs
    R
    Seuls les utilisateurs enregistrés peuvent rejoindre le salon
    S
    Supprime toutes les couleurs
    s
    Rend le salon secret (n'apparaît plus dans la liste des salons)
    t
    Seuls les chanops peuvent changer le topic
    T
    Aucune notice ne peut être envoyée sur le salon
    u
    Auditorium – Les commandes /names et /who #chan n'affichent que les opérateurs
    V
    /invite n'est pas autorisé
    v <nick>
    Donne le statut de voice à l'utilisateur (peut parler quand le salon est modéré, +m)
    z
    Seul les utilisateurs avec une connexion sécurisée (SSL) peuvent joindre le salon
    +

     

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Mode
    Description
    Modes des utilisateurs
    r
    Identifie le pseudo comme étant enregistré
    s
    Peut lire les server notices
    v
    Reçoit les notices de refus de DCC infectés
    o
    Global IRC Operator (défini par Oper Block)
    O
    Local IRC Operator (défini par Oper Block)
    B
    Vous renseigne comme étant un bot
    i
    Invisible (n'est pas montré dans un /who)
    A
    Server Admin (défini dans Oper Block)
    x
    Donne à l'utilisateur un hostname caché
    q
    Seul les U:Lines peuvent vous kicker (Services Admin uniquement)
    a
    Services Admin (défini dans Oper Block)
    g
    Peut envoyer et lire les globops et locops
    H
    Cache le status d'IRCop (IRCop uniquement)
    S
    Utilisé pour protéger les Services Daemons
    t
    Dis que vous utilisé un /vhost
    C
    Co-Admin (défini dans Oper Block)
    d
    Fait en sorte que vous ne puissiez pas recevoir de message provenant des channels
    N
    Network Administrator (défini dans Oper Block)
    w
    Peut lire les wallops
    h
    Disponible pour aide (HelpOp) (défini dans Oper Block)
    G
    Filtre tous les bad words définis par configuration
    W
    Vous laisse voir quand quelqu'un vous /whois (IRCop uniquement)
    p
    Cache les canaux sur lesquels vous êtes dans les /whois
    R
    Vous permet de ne recevoir de messages privés et de notices que d'utilisateurs enregistrés (+r)
    V
    Vous marque comme un utilisateur de WebTV
    z
    Indique que vous êtes un client SSL
    T
    Vous empêche de recevoir des CTCPs
    +

    +

    7 – Commandes utilisateurs et opérateurs

    +

    Notez que la documentation fournie par /helpop est plus à jour, utilisez /helpop commande (ou /helpop ?commande si vous êtes oper) + pour avoir des informations sur une commande.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Commande
    Description
    Qui
    nick <newnickname>Change votre pseudo. Averti les autres de votre changement de pseudo
    Tous
    whois <nick>Affiche les informations sur l'utilisateur ciblé. Inclus le pseudo, l'host, les salons sur lesquels il se trouve et son statut d'Oper. + Si vous êtes un IRCOP, vous avez accès à plus d'informations tel que les umodes de l'utilisateur.
    Tous
    who <mask>Vous permet de chercher des utilisateurs. + Masks inclus : pseudo, #salon, hostmask (*.attbi.com)
    Tous
    whowas <nick> <max de réponses>Affiche les informations sur un pseudo qui n'est plus connecté. + Le nombre maximum de réponses est facultatif et limite le nombre d'enregistrements qui seront retournés
    Tous
    ison <nick1 nick2 nick3 ...>Vous permet de vérifier qu'un utilisateur (ou plusieurs) est connecté. + Réponse simple, meilleur usage pour les scripts.
    Tous
    join <channel1,channel2, ...>Vous permet de rejoindre des salons. Utiliser /join #salon1,#salon2,#salon3 + vous permettra de rejoindre plus d'un salon en une fois. La commande /join 0 vous + fait partir (PART) de tous les salons.Tous
    cycle <channel1, channel2, ...>Cycle les salons spécifiés. Cette commande équivaut à faire un PART suivi d'un JOIN. + ( Pour les utilisateurs de mIRC, la commande /hop est équivalente )Tous
    motd <server>Affiche le motd ( Message Of The Day ) du serveur. Vous pouvez spécifier un nom de + serveur si vous souhaitez voir le motd d'un serveur particulier sur un réseau.
    Tous
    rules <server>Affiche le ircd.rules d'un serveur. Ajouter le nom d'un serveur. Vous pouvez spécifier un nom + de serveur si vous souhaitez voir le ircd.rules d'un serveur particulier sur un réseau.Tous
    lusers <server> Affiche le nombre actuel et maximum d'utilisateurs, en global et local. Vous pouvez spécifier + un nom de serveur si vous souhaitez voir les statistiques d'un serveur particulier sur un réseau.
    Tous
    mapAffiche la carte (map) du réseauTous
    quit <reason>Vous déconnecte du serveur. Si vous ajoutez une raison, + elle sera affichée sur tous les salons, lorsque vous quitterez.Tous
    ping <user>Envoie une requête de PING à l'utilisateur. Utilisé pour vérifier une connexion et son lag. + Les serveurs envoient des pings à des moments déterminés pour vérifier que les utilisateurs + sont toujours connectés.
    Tous
    version <nick>Cela envoie une requête de CTCP Version à l'utilisateur. + Si il est configuré pour, le client renverra sa version en réponse.
    Tous
    linksAffiche la liste de tous les serveurs reliés au réseau.Tous
    Admin <server>Affiche les "admin info" du serveur. Si un nom de serveur est inclus, + il affichera les infos de ce serveur.
    Tous
    userhost <nick>Affiche les userhost du pseudo spécifié. Généralement utilisé pour les scripts.
    All
    topic <salon> <topic>Topic <salon> affichera le topic courrant du salon spécifié. Topic + <salon> <topic> changera le topic du salon spécifié.
    Tous
    invite <nick> <channel>Invite l'utilisateur spécifié à rejoindre le salon spécifié. (Vous devez être channel Op)
    ChanOp
    kick <channel, channel> <user, user> <reason>Kick le ou les utilisateurs spécifiés du ou des salons spécifiés. + Une raison peut également être précisée.
    ChanOp
    away <raison>Vous marque comme étant absent. Une raison peut également être spécifiée.
    Tous
    Watch +-<nick> +-<nick>
    Watch est un nouveau système de "notify-type" dans UnrealIRCd qui est en même + temps plus rapide et moins gourmant en ressources du réseau qu'aucun autre ancien + système de notify. Le serveur vous envoye un message lorsqu'un pseudo de votre + watch list se connecte ou se déconnecte. La watch list NE RESTE PAS ENTRE 2 + SESSIONS - vous (ou votre script ou client) devez ajouter les pseudos dans la watch + list à chaque fois que vous vous connectez sur un serveur IRC.
    Tous
    helpop ?<topic> ou !<topic>
    HelpOp est un nouveau système pour avoir l'aide d'un serveur IRC. + Vous tapez soit /HELPOP ? <sujet du système d'aide> ou /HELPOP ! <question> + Le "?" dans /HELPOP veut dire interroger le système d'aide et si vous n'avez pas de réponse, + "!" enverra la question à un Opérateur connecté. Utiliser ? et ! signifie que la question + sera d'abord envoyée au système d'aide et que si aucune réponse n'est trouvée, elle sera + envoyée à un Opérateur.Tous
    list <élément recherché> + Si vous ne spécifiez pas d'élément recherché, par défaut toute la liste des salons vous serra envoyée. + Ci-dessous, les options que vous pouvez utiliser, et ce que la liste des salons vous reverra lorsque + vous les utiliserez.
    + >nombre affichera la liste des salons comptant plus de <nombre> utilisateurs.
    + <nombre affichera la liste des salons comptant moins de <nombre> utilisateurs.
    + C>nombre affichera les salons créés depuis <nombre> minutes
    + C<nombre affichera les salons créés avant <nombre> minutes.
    + T>nombre affichera les salons dont le topic n'a plus été changé depuis au moins <nombre> minutes + (Ie., ils n'ont pas chnagés dans les dernières <nombre> minutes.
    + T<nombre affichera les salons dont le topic a été changé depuis moins de <nombre> minutes.
    + *mask* affichera les salons comprennant *mask*
    + !*mask* affichera les salons ne comprennant pas *mask*
    Tous
    Knock <salon> <message>
    Vous permet de ‘frapper à la porte’ d'un salon sous + invitation pour demander le droit de le rejoindre. Ne fonctionnera + pas sur les salons ayant les modes suivants : +K +V. Ne fonctionnera + pas non plus si vous êtes banni.
    Tous
    setnamePermet aux utilisateurs de changer leur ‘Real Name’ sans avoir à se reconnecter.
    Tous
    vhost <login> <mot de passe>Cache votre host en utilisant une vhost fournie par le serveur.
    Tous
    mode <salon/pseudo> <mode>
    Vous permet de changer les modes des salons et des utilisateurs. Voir + Modes des salons et des utilisateurs pour avoir la liste.
    Tous
    creditsAffiche la liste de toutes les personnes ayant aider à créer UnrealIRCd.
    Tous
    licenseAffiche la licence GNU.Tous
    time <server>Affiche la date et l'heure du serveur. Spécifier un nom de serveur + vous permet d'interroger un autre serveur.
    Tous
    botmotd <server>
    Affiche le motd du serveur de bot. Spécifier un nom de serveur + vous permet d'interroger un autre serveur.Tous
    identify <mot de passe>Envoie votre mot de passe aux services pour identifier votre pseudo.
    Tous
    identify <salon> <mot de passe>Envoie votre mot de passe aux services pour vous identifier en tant + que "founder" (fondateur) d'un salon.
    Tous
    dns <option>Renvoie les informations concernant les DNS cache du serveur IRC. + Notez que depuis, certains clients ont leur propre commande DNS, vous pourrez + alors utiliser /raw DNS. Les Opérateurs peuvent spécifier un "l" comme premier + paramètre dans la commande pour recevoir une liste d'entrée dans le DNS cache.Tous
    oper <login> <mot de passe>
    Commande pour donner le status d'Opérateur à un utilisateur si les spécifications correspondent à un Oper Block.
    IRCop
    wallops <message>Envoie un message à tous les utilisateurs +wIRCop
    globops <message>Envoie un message à tous les IRCopsIRCop
    chatops <message>Envoie un message à tous les IRCops ayant le mode +cIRCop
    locops <message>Envoie un message à tous les IRCops locauxIRCop
    adchat <message>Envoie un message à tous les AdminsIRCop
    nachat <message>Envoie un message à tous les Net AdminsIRCop
    kill <nick> <raison>Kill l'utilisateur du réseauIRCop
    kline [+|-]<user@host | nick> [<durée du ban> <raison>]Bannir le hostmask du serveur sur lequel la commande a été utilisée. Une kline n'est pas un ban global.
    + La durée du ban peut être: a) une valeur en seconde, b) une durée, comme "1d" pour un jour (day) c) "0" pour permanent. + Le temps et la raison son optionnels, si rien n'est spécifié, ce sera set::default-bantime (défaut : 0 / permanent) et "no reason" qui seront utilisés.
    + Pour enlever une kline, utilisez /kline -user@host.
    IRCop
    zline [+|-]<*@ip> [<durée du ban> <raison>]Banni une adresse ip du serveur locals sur lequel la commande a été utilisée (pas global). Regardez kline pour plus d'informations. + Utilisez /zline -*@ip pour l'enlever.
    IRCop
    gline [+|-]<user@host | nick> [<durée du ban> <raison>]
    Ajoute un ban global sur l'utilisateur spécifié. Regardez kline pour plus d'informations. + Utilisez /gline -user@host pour l'enlever.
    IRCop
    shun [+|-]<user@host | nick> [<durée du shun> <raison>]
    Empêche un utilisateur d'utiliser n'importe quelle commande et de parler. Les shuns sont globaux (comme les glines). + Regardez kline pour plus d'informations. + Utilisez /shun -user@host pour l'enlever. +
    IRCop
    gzline [+|-]<ip> <durée du ban> :<raison>
    Ajoute une zline globale. Regardez kline pour plus d'informations. + Utilisez /gzline -*@ip pour l'enlever.
    IRCop
    rehash <server> –<flags>Rehash le fichier de configuration des serveurs. Spécifier un nom de serveur, vous permet de + rehasher le fichier de configuration d'un serveur distant. + De nombreux flags sont disponibles. Ils incluent :
    + -motd - rehash uniquement les fichiers MOTD et RULES (incluant tld {})
    + -opermotd - rehash uniquement le fichier OPERMOTD
    + -botmotd - rehash uniquement le fichier BOTMOTD
    + -garbage - Force garbage collection
    +
    IRCop
    restart <server> <mots de passe>
    Relance l'IRCD Process. Le mot de passe est requis. Vous devez aussi + spécifier un nom de serveur pour relancer un serveur distant.
    IRCop
    die <mots de passe>
    Arrête un IRCD Process. Le mot de passe est requis.IRCop
    lag <server>
    Cette commande est comme un Sonar ou un Traceur pour serveur IRC. + Vous tapez /LAG irc.rs2i.net et il a mis pour trouver un serveur et donc + le fait qu'il fonctionne. Utile lorsque vous cherchez d'ou viens le lag et + en option les TS futurs et passés.
    IRCop
    sethost <nouveau host>Vous permet de changer votre vhost.
    IRCop
    setident <nouvel ident>
    Vous permet de changer votre ident.
    IRCop
    chghost <nick> <nouvel host>
    Vous permet de changer votre l'hostname d'un utilisateur connecté.
    IRCop
    chgident <nick> <nouvel ident>
    Vous permet de changer votre l'ident d'un utilisateur connecté.
    IRCop
    chgname <nick> <nouveau nom>
    Vous permet de changer votre le realname d'un utilisateur connecté.
    IRCop
    squit <server>
    Déconnecte un serveur du réseau.
    IRCop
    connect <server> <port> <server>Si un seul serveur est précisé, le serveur sur lequel vous êtes va tenter de se connecter + au serveur spécifié. Si 2 serveurs sont précisés, ils vont tenter de se connecter l'un à l'autre. + Mettre le hub en deuxième position.
    IRCop
    dccdeny <filemask> <reason>
    Ajoute un DCCDENY pour ce filemask. Empêche ce fichier d'être envoyé.
    IRCop
    undccdeny <filemask>
    Enlève un DCCDENYIRCop
    sajoin <nick> <channel>, <channel>
    Force l'utilisateur à joindre le, les salons. Accessible par les services et network + admins seulement.IRCop
    sapart <nick> <channel>, <channel>
    Force l'utilisateur à partir du, des salons. Accessible par les services et network + admins seulement.
    IRCop
    samode <channel> <mode>
    Permet aux services et network admins de changer les modes d'un salon sans + en être ChanOp.
    IRCop
    rping <servermask>
    Calcule en millisecondes le lag entre les serveurs.
    IRCop
    trace <servermask|nickname>
    Quand elle est utilisée sur un utilisateur, elle vous donnera les informations sur la classe et le lag. + Si elle est utilisée sur un serveur, elle vous donnera les informations sur le classe, la version et le link.
    IRCop
    opermotd
    Affiche le fichier OperMotd des serveurs.
    IRCop
    addmotd :<text>
    Ajoute le texte donné à la fin du Motd
    IRCop
    addomotd :<text>
    Ajoute le texte donné à la fin du OperMotd
    IRCop
    sdesc <nouvelle description>
    Permet aux server admins de changer la description de leur serveur + sans avoir a le relancer.
    IRCop
    addline <texte>
    Vous permet d'ajouter des lignes à unrealircd.conf
    IRCop
    mkpasswd <mots de passe>
    Va encrypter un mot de passe pour l'ajouter dans le unrealircd.conf
    IRCop
    tsctl offset +/- <time>
    Ajuste l'horloge interne de l'IRCD (NE PAS utiliser si vous ne savez pas exactement + ce que vous faites).
    IRCop
    tsctl time
    Donnera un TS Report.IRCop
    tsctl alltimeDonnera un TS Report de tous les serveurs.IRCop
    tsctl svstime <timestamp>
    Applique le temps TS à tous les serveurs (NE PAS utiliser si vous ne savez pas + exactement ce que vous faites).
    IRCop
    htm <option>
    Réglages relatifs au mode "high traffic". Le mode "high traffic" (HTM) + désactive certaines commandes comme : list, whois, who, etc. en réponse à un + traffic important sur le serveur. Les options sont :
    + -ON Force le passage du serveur en HTM
    + -OFF Force la sortie du serveur du HTM
    + -NOISY Active l'avertissement des utilisateurs / admins lorsque le serveur entre / sort du HTM
    + -QUIT Désactive l'avertissement des utilisateurs / admins lorsque le serveur entre / sort du HTM
    + -TO <valeur> Dis au HTM, à quel taux il doit s'activer
    IRCop
    stats <option>
    + B - banversion - envoie la liste des versions de ban
    + b - badword - envoie la liste des mots censurés
    + C - link - envoie la liste des link block
    + d - denylinkauto - envoie la liste des links block (auto) interdits
    + D - denylinkall - envoie la liste des links block (tous) interdits
    + e - exceptthrottle - envoie la liste des except throttle block
    + E - exceptban - envoie des except ban block
    + f - spamfilter - envoie la liste des spamfilter
    + F - denydcc - envoie la liste des deny dcc block
    + G - gline - envoie la liste des gline
    +   Flags secondaires: [+/-mrs] [masque] [raison] [mis par]
    +     m Renvoie les glines contenant / ne contenant pas la mask spécifié
    +     r Renvoie les glines dont la raison est / n'est pas celle spécifiée
    +     s Renvoie les glines mis / n'ont mis par la personne spécifiée
    + I - allow - envoie la liste des allow block
    + j - officialchans - envoie la liste des salons officiels
    + K - kline - envoie la liste des ban user / ban ip / except ban
    + l - linkinfo - envoie les informations sur le link
    + L - linkinfoall - envoie les informations sur les links
    + M - command - envoie le nombre de fois que les commandes ont été utilisées
    + n - banrealname - envoie la liste des ban realname block
    + O - oper - envoie la liste des oper block
    + S - set - envoie la liste des set block
    + s - shun - envoie la liste des shuns
    +   Flags secondaires: [+/-mrs] [masque] [raison] [mis par]
    +     m Renvoie les glines contenant / ne contenant pas la mask spécifié
    +     r Renvoie les glines dont la raison est / n'est pas celle spécifiée
    +     s Renvoie les glines mis / n'ont mis par la personne spécifiée
    + P - port - envoie les informations concernant les ports
    + q - sqline - envoie la liste des SQLINE
    + Q - bannick - envoie la liste des ban nick block
    + r - chanrestrict - envoie la liste des chans deny / allow block
    + R - usage - envoie les informations d'usage
    + t - tld - envoie la liste des tld block
    + T - traffic - envoie les informations sur le traffic
    + u - uptime - envoie l'uptime du serveur et le nombre de connections
    + U - uline - envoie la liste des ulines block
    + v - denyver - envoie la liste des deny version block
    + V - vhost - envoie la liste des vhost block
    + X - notlink - envoie le liste des serveurs qui ne sont pas actuellement linkés
    + Y - class - envoie la liste des class block
    + z - zip - envoie les informations sur la compression des serveurs ziplinked (si ils ont été compilés avec le support ziplink)
    + Z - mem - envoie les informations sur la mémoire utilisée
    +
    Tous
    module
    + Liste tous les modules chargés + Tous
    close
    + Cette commande déconnectera toutes les connections inconnues du serveur IRC. + IRCOp
    + +

    + +

    8 – Conseils de sécurité/checklist

    +
    +

    Si vous êtes concernés par la sécurité, et vous le devriez, cette section vous donnera un aperçu + des risques possibles et leurs niveaux de sensibilité. Vous pouvez également utiliser celle-ci + comme une checklist pour parcourir la configuration de votre réseau et le rendre plus sécurisé.

    +

    Cette liste est ordonnée suivant la popularité, le niveau de risque et les méthodes les plus souvent utilisées :

    +

    + +

    8.1 Mots de passe

    +Choisissez de bons mots de passe oper, link, etc. :
    +- mélangez les lettres (majuscules et minuscules) et les chiffres ("Whbviwf5") et/ou quelque chose de long ("blaheatsafish", "AlphaBeta555").
    +- N'UTILISEZ PAS vos mots de passe oper, link pour autre chose comme votre compte mail, bot, forums, etc ...
    +

    + +

    8.2 Vulnérabilités non lièes à l'IRCd

    +Il y a beaucoup plus de chance qu'un serveur se fasse pirater à cause d'une vulnérabilité non-ircd qu'à cause +d'un bug UnrealIRCd. Si vous faites tourner sur la même machine des serveurs http, dns, smpt ou ftp par exemple, +vous avez de plus grands risques. Aussi, si vous êtes sur une machine Multi-Utilisateurs (ex. : vous louez un shell) +il y a des risques de failles locales ou mauvaises permissions (voir plus loin). Le risque est grand donc soyez prudent +lors du choix de votre loueur de shell. +

    + +

    8.3 Permissions et fichier de configuration

    +Soyez toujours sur que vos dossiers home et UnrealIRCd ont des permissions correctes, +les autres groupes ne doivent pas avoir la permission de les lire. Sinon un utilisateur local pourra +ouvrir votre configfile (fichier de configuration) et chercher les mots de passe ... +Vous pouvez faire : chmod -R go-rwx /path/to/Unreal3.2 si vous n'en êtes pas sûr.
    +Autres choses dans le même style : ne mettez jamais votre UnrealIRCd dans un webroot ou un autre type de fichier partagé. +Et pour les backups (sauvegardes), assurez vous qu'elles aient les bonnes permissions également (il arrive assez souvent +que tout est bien sécurisé mais qu'il y a un backup.tar.gz quelque part lisible par tout le monde).
    +
    +Vous pourrez également vouloir crypter les mots de passe lorsque ce sera possible. +Notez que même si ceci n'est "qu'une autre couche de sécurité", beaucoup de mots de passe de 1 à 8 caractères +peuvent être craqués en moins de quelques heures, et il y a souvent d'autres informations intéressantes non +cryptées dans le configfile (comme link::password-connect). +

    + +

    8.4 Problèmes liés aux utilisateurs

    +Tout comme beaucoup des choses dites ici, ceci n'est pas spécifique à UnrealIRCd, mais ...
    +Choisissez toujours bien vos opers et admins. Et rappelez-vous le concept du maillon faible. +Même si vous êtes prudents et suivez la documentation, peut-être qu'un de vos amis oper fera quelque chose de stupide. +Comme partager son disque dur via netbios/kazaa/morpheus/..., avoir un trojan, utiliser un mauvais mot de passe, etc etc ... +Malheureusement, ce n'est pas toujours sous votre contrôle. +

    + +

    8.5 SSL/SSH & sniffing

    +Utilisez des connections SSL entre les serveurs et pour les opers, cela vous protègera cointre le "sniffing". +Le sniffing est possible si quelqu'un attaque un serveur entre vous et votre serveur ircd, il pourra voir +tout votre traffic qui passe par ce serveur; lire les conversations, récupérer les mots de passe +(les logins oper, nickserv, etc ...) ... Pour les mêmes raisons, utilisez toujours ssh à la place de telnet. +

    + +

    8.6 Denial of Service attacks (DoS) [ou: comment protéger mon hub]

    +Beaucoup de réseaux ont expérimenté combien était "fun" un flood ou une (D)DoS attaque, vous pouvez +toutes fois faire certaines choses permettant d'en réduire les dommages. La plupart des réseaux ont +un serveur hub, ce que certaines personnes oublient, c'est qu'il est assez facile de protèger le hub contre des attaques.
    +Je vais l'expliquer ici :
    +1. Choissisez pour le hub un hostname qui n'existe pas (ex. : hub.yournet.com), mais n'ajoutez
    +    pas un enregistrement de dns pour lui.
    +    De cette manière, un attaquant ne pourra résoudre ni resoudre son host, ni le flooder.
    +    Ensuite, linkez vos serveurs au hub en spécifiant l'ip ou un hostname non publique
    +    Exemple 1: link visibiblename.yournet.com { hostname 194.15.123.16; [etc] };.
    +    Exemple 2: link visibiblename.yournet.com { hostname thehostnamethatworks.yournet.com; [etc] };.
    +    Remarque : pour le dernier exemple, vous devez être sûr que votre nom de serveur ne permet pas de zones de transfert, mais ceci nous éloigne du sujet.
    +2. Une autre étape importante est alors de cacher "/stats c" et autres informations "stats" sinon les attaquants
    +    pourront simplement lister vos links blocks. Si vous êtes paranoyaque,vous pouvez simplement faire :
    +    set { oper-only-stats "*"; }; pour restreindre l'utulisation de tous les /stats.
    +    Si vous ne voulez pas cela, cachez seulement "CdDlLXz". Vous en verrez plus sur ce sujet dans la section suivante.
    +
    +Évidemment, ces étapes sont moins utiles si elles sont appliquées ultérieurement (ex.: après quelques mois)
    +Au lieux de dès le début puisque l'IP peut déjà être connu de quelqu'un de malveillant, jusqu'à ... Ça vaut la peine de le faire.
    +Notez aussi que les attaquants peuvent toujours flooder les serveurs qui ne sont pas des Hubs,
    +mais cela demande plus d'efforts que juste attaquer 1 ou 2 points faibles (les hubs), aussi de cette manière vos hubs et +services resteront saufs :).
    +

    + +

    8.7 Conseil sur la divulgation d'informations

    +STATS
    +La commande /stats fournit beaucoup d'informations, vous voulez probablement restreindre son usage le plus possible. +Une question que vous devez vous poser est "Qu'est ce que je veux que mes utilisateurs voient ?". +La plupart des gros réseaux choisissent "rien", lorsque d'autres préfèrent que leurs clients puisse faire "/stats g" et "/stats k".
    +Je vous suggère d'utiliser set { oper-only-stats "*"; }; pour empêcher tous /stats pour les non-opers, +mais si vous ne voulez pas cela, inspectez la liste des "/stats" et empèchez l'accès à tous ce que vous voulez... +(en cas de doute, empècher... Pourquoi auraient-ils besoin de savoir cela ?
    +Pour vous donner quelques exemples :
    +- /stats o: vous donne le noms des opers (avec la 'case' correcte) et leurs hostmasks.
    +- /stats c: vous donne une idée des links et qui peut être utilisée comme backup, etc ...
    +- /stats g, /stats k: en général utilisés pour bannir les proxys ... donc cela donnera juste aux attaquants + une liste de proxys qu'ils peuvent utiliser.
    +- /stats E, /stats e: informations plut sensibles, spécialement si un attaquant peut utiliser ces adresses.
    +- /stats i, /stats y: peut aider un attaquant à trouver des hosts permettant beaucoup de connections.
    +- /stats P: aide à trouver des ports serveronly
    +etc etc...
    +
    +MAP / LINKS
    +Beaucoup de personnes ont demandé si il était possible de désactiver /map ou /links. +Notre position sur ce sujet est que c'est bête et donne un mauvais sens à la sécurité, laissez moi vous expliquer... +Cacher les serveurs sur lesquels les utilisateurs sont connectés est inutile vu qu'ils les connaissent déjà +(sinon comment s'y seraient-ils connectés ?). +Pour les serveurs sur lesquels vous ne voulez aucuns utilisateurs, reportez vous à la section 8.6.
    +Maintenez, que POUVEZ vous faire ? Depuis la version 3.2.1, il existe une option appelée 'flat map' (set::options::flat-map), +cela fera apparaître tous les serveurs comme 'directement connectés' dans /map et /links, comme cela les utilisateurs +ne sauront plus voir quel serveur est lié au quel... Ca peut être une bonne couche supplémentaire de protection car +ainsi une personne ne pourra pas repérer les 'points faibles' avec /map ou /links. +Donc, utiliser cela est recommandé. Notez que cela n'élimine pas totalement les risques... +Si un split arrive, quelqu'un peut toujours voir quel serveur est linké auquel, et ceci est aussi valable pour d'autres choses.
    +
    +UTILISATEURS NORMAUX ET SNOMASKS
    +Une chose qui n'est pas toujours connues est que les utilisateurs normaux peuvent également s'appliquer certains snomask limités, +appelé +s +sk. Grâce à cela, ils peuvent voir des choses comme les rehashes, l'identification d'opers, les kills et d'autres messages variés.
    +Pour désactiver cela, vous pouvez utiliser set::restrict-usermodes comme ceci : set { restrict-usermodes "s"; };.
    +
    +Évidement tout ceci n'est que de la "dissimulation d'informations", ce n'est pas de la "vraie" sécurité. +Cela rendra plus difficiles / importants les efforts requis pour attaquer / pirater.
    +

    + +

    8.8 Se protéger des exploits

    +Il y a des patches de kernel qui rendent plus difficiles les stack- et heap-based exploits. Cela ne devrait pas être votre principal point d'inquiétude, +vous avez des risques de loin plus importants d'être attaqué par d'autres points que celui-ci... Pour des raisons variées.
    +
    +Il y a en tout cas une chose que vous devez faire, qui est TOUJOURS UTILISER LA DERNIÈRE VERSION, +inscrivez vous à la unreal-notify mailinglist +tout de suite et vous recevrez les annonces de release (la unreal-notify est pour les annonces de release uniquement, +d'où seulement 1 mail tout les X mois). En général il est explicitement mentionné dans l'annonce si la release permet +de fixer (de hauts risques) de sécurité.
    +

    + +

    8.9 Conclusion

    +Comme vous l'aurez je l'espère maintenant compris, vous ne pouvez jamais être 100% sécurisé. +Vous (et nous) devons trouver et éliminer toutes les failles car un attaquant a juste besoin de trouver une +faille sur un serveur. Tout ce qui a été expliqué ici DOIT de toutes façons aider à minimiser les risques +considérablement. Prenez le temps de sécuriser votre réseau et éduquer vos opers. +Beaucoup de personne ne prennent pas attention à la sécurité, jusqu'à ce qu'ils se fassent attaquer, essayez d'éviter ca :). +

    + + +

    9 – Foire aux Questions (FAQ)

    +

    La FAQ est disponible en ligne ici

    +

    + \ No newline at end of file diff --git a/doc/unreal32docs.html b/doc/unreal32docs.html index 242bb85e0..3033f2099 100644 --- a/doc/unreal32docs.html +++ b/doc/unreal32docs.html @@ -21,12 +21,14 @@ English | German | Spanish | -Hungarian

    +Hungarian | +French +

    UnrealIRCd
    http://www.unrealircd.com
    - Version: 3.2.1
    - Current Version: 3.2.1
    - Last doc update: 2004-07-03
    + Version: 3.2.2
    + Current Version: 3.2.2
    + Last doc update: 2004-10-11

    Head Coders: Stskeeps / codemastr / Syzop / Luke
    Contributors: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
    @@ -164,7 +166,7 @@ Windows:

    2.0 - Installation


    - Tested & Supported Operating Systems:
    + Tested & Supported Operating Systems:
    • *NIX versions:
        @@ -192,8 +194,8 @@ Windows:

        Installation Instructions
        Linux:

          -
        1. gunzip -d Unreal3.2.tar.gz -
        2. tar xvf Unreal3.2.tar +
        3. gunzip -d Unreal3.2.2.tar.gz +
        4. tar xvf Unreal3.2.2.tar
        5. cd Unreal3.2
        6. ./Config
        7. Answer these questions to the best of your knowledge. Generally if your not @@ -262,6 +264,7 @@ Windows:
          q - deny nick (Q:line) rejection notices
          s - receives server notices [*]
          S - receives spamfilter notices
          + o - receives oper-up notices
          [*: this snomask is also allowed to non-ircops]

          You can control which snomasks you automatically get (set::snomask-on-connect) and which you get @@ -302,7 +305,7 @@ Windows:
          that understands the SSL protocol.

          Clients that support SSL: XChat, irssi, - mIRC (6.14 and up, + 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,8 +469,19 @@ Modules can also add other extended ban types.

          Spamfilters are added via the /spamfilter command which uses the following syntax:
          /spamfilter [add|del|remove|+|-] [type] [action] [tkltime] [reason] [regex]
          - + - - + +
          [type] specifies the target type, you can specify multiple targets: - 'c' channel msg, 'p' private msg, 'n' private notice, 'N' channel notice, 'P' part msg, 'q' quit msg, 'd' dcc
          [type] specifies the target type:
          + + + + + + + + + + +
          Char:Config item:Description:
          cchannelChannel message
          pprivatePrivate message (from user->user)
          nprivate-noticePrivate notice
          Nchannel-noticeChannel notice
          PpartPart reason
          qquitQuit reason
          ddccDCC filename
          uuserUser ban, will be matched against nick!user@host:realname
          + You can specify multiple targets, like: cpNn
          [action] specifies the action to be taken (only 1 action can be specified)
          @@ -479,7 +493,7 @@ Modules can also add other extended ban types.
          -
          killkills the user
          gzlineputs a gzline (global zline) on the host
          blockblock the message only
          dccblockmark the user so (s)he's unable to send any DCCs
          viruschanpart all channels, join set::spamfilter::virus-help-channel, disables all commands +
          viruschanpart all channels, join set::spamfilter::virus-help-channel, disables all commands except PONG, ADMIN, and msg/notices to set::spamfilter::virus-help-channel
          [tkltime] The duration of the *line added by the filter, use '-' to use the default or to skip @@ -505,7 +519,14 @@ into spaces at runtime. And double underscore ('__') gets an underscore ('_'). A

          You can also add spamfilters in the config file but these will be local spamfilters (not network-wide, though you could use remote includes for this). The syntax of these spamfilter { } blocks are explained here
          -

          + Example:
          +
          spamfilter {
          +	regex "//write \$decode\(.+\|.+load -rs";
          +	target { private; channel; };
          +	reason "Generic $decode exploit";
          +	action block;
          +};

          +

          set::spamfilter::ban-time allows you to modify the default ban time for *lines added by spamfilter (default: 1 day)
          set::spamfilter::ban-reason allows you to specify a default reason for the *lines (default: 'Spam/advertising')
          set::spamfilter::virus-help-channel allows you to specify the channel to join for action 'viruschan' (default: #help)
          @@ -805,6 +826,7 @@ listen *:6601 { }; swhois <whois info>; snomask <snomask>; + modes <modes>; maxlogins <num>; };

          @@ -1108,6 +1130,8 @@ listen *:6601 {

          The oper::snomask directive allows you to preset an oper's server notice mask on oper up. For a list of available SNOMASKs, see Section 3.3 [optional]

          +

          The oper::modes directive allows you to preset an oper's modes on oper up. + [optional]

          The oper::maxlogins allows you to restrict the number of concurrent oper logins from this host, for example if you set it to 1 then only 1 person can be oper'ed via this block at any time. [optional]

          @@ -1460,6 +1484,11 @@ except ban { except tkl { mask <hostmask>; type <type>; + type { + <type>; + <type>; + ... + }; };

          The except tkl block allows you to specify a user@host that will override a tkl ban placed on a broader host. This is useful when you want an ISP banned, but @@ -1467,7 +1496,8 @@ except tkl { 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, qline, gqline, and shun, which make an exception from Glines, - Global Zlines, Qlines, Global Qlines, and shuns.

          + Global Zlines, Qlines, Global Qlines, and shuns. If the type {} format is used, + multiple types may be specified.

          Example:

           except tkl {
          @@ -1757,6 +1787,7 @@ link <server-name> {
           	leaf <leaf-mask>;
           	leafdepth <depth>;
           	class <class-name>;
          +	ciphers <ssl-ciphers>;
           	options {
           		<option>;
           		<option>;
          @@ -1816,6 +1847,10 @@ link <server-name> {
           

          compression-level (optional)
          Specifies the compression level (1-9) for this link. Only used if link::options::zip is set.

          +

          ciphers (optional)
          + Specifies the SSL ciphers to use for this link. To obtain a list of available ciphers, use + the `openssl ciphers` command. Ciphers should be specified as a : separated list. +

          options block
          One or more options used for connecting to the server. Sometimes not needed.
          @@ -1854,23 +1889,24 @@ link hub.mynet.com {

          Syntax [standard alias]:

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

          (Note: also see here about the standard alias files UnrealIRCd has)

          The alias block [standard alias] allows you to forward a command to a user, for example /chanserv sends a message to the user chanserv. The alias:: specifies - the name of the command that will be the alias (eg: chanserv), alias::nick is - the nickname it will forward to, if the alias:: is the same as the nick it will - forward to, alias::nick can be left out. The alias::type specifies the type + the name of the command that will be the alias (eg: chanserv), alias::target is + the nickname or channel it will forward to, if the alias:: is the same as the target, it will + forward to, alias::target can be left out. The alias::type specifies the type of alias, valid types are services (the user is on the services server), stats - (the user is on the stats server), and normal (the user is a normal user on - any server). The alias block also has another purpose which is explained below.

          + (the user is on the stats server), normal (the user is a normal user on + any server), and channel (the target is a channel name). The alias block also has another + purpose which is explained below.

          Syntax [command alias]:

           alias <name> {
           	format <regex-expression> {
          -		nick <nick-to-forward-to>;
          +		target <nick-to-forward-to>;
           		type <type-of-alias>;
           		parameters <parameter-string>;
           	};
          @@ -1885,15 +1921,16 @@ alias <name> {
             a regular expression that compares against the text sent to the alias command, 
             when matched the sub-entries of that alias::format will be used, you may have 
             multiple alias::format's to make the command do different things depending on 
          -  the text sent to it. The alias::format::nick is the nickname to forward this
          +  the text sent to it. The alias::format::target is the target to forward this
             alias to. The alias::format::type specifies the type of the alias that the
             message should be forwarded to. The alias::format::parameters is what will 
             be sent as the parameters to this alias. To specify one of the parameters given 
             to the command alias specify % followed by a number, for example, %1 is the 
             first parameter. To specify all parameters from a given parameter to the end 
             do % followed by the number and a -, for example %2- returns all parameters 
          -  from the second till the last. For examples of using the alias block in the 
          -  command format, consult doc/example.conf.

          + from the second till the last. Additionally, you may specify %n which will be replaced + by the nickname of the user who executed the command. For examples of using the alias + block in the command format, consult doc/example.conf.

          4.33 - Help Block OPTIONAL @@ -1951,9 +1988,8 @@ spamfilter { ban-time <time>; };

          regex is the regex to be matched.
          - target specifies the targets, possible targets are: channel, private, private-notice, channel-notice, - part, quit, dcc.
          - action specifies the action to be taken, see here for a list of possible actions.
          + target specifies the targets, see here for a list of possible types (eg: 'channel').
          + action specifies the action to be taken, see here for a list of possible actions (eg: 'gline').
          reason optional: specifies the ban or block reason, else the default is used.
          ban-time optional: specifies the duration of a *line ban, else the default is used (1 day).

          @@ -2160,18 +2196,23 @@ set { Defines the prefix that will be used on hiddenhosts (+x). This is usually three or four letters representing the network name.

          set::hosts::local <locop-host-name>;
          - Defines the hostname that will be assigned to local opers when they set +x.

          + Defines the hostname that will be assigned to local opers when they set +x. You may + optionally specify a username@host for this value.

          set::hosts::global <globop-host-name>;
          Defines the hostname that will be assigned to global operators when they set - +x.

          + +x. You may optionally specify a username@host for this value.

          set::hosts::coadmin <coadmin-host-name>;
          - Sets the hostname that will be assigned to co-admins when they set +x.

          + Sets the hostname that will be assigned to co-admins when they set +x. You may + optionally specify a username@host for this value.

          set::hosts::admin <admin-host-name>;
          - Defines the hostname that will be set for admins when they set +x.

          + Defines the hostname that will be set for admins when they set +x. You may + optionally specify a username@host for this value.

          set::hosts::servicesadmin <servicesadmin-host-name>;
          - Sets the hostname that will be given to services-admins when they set +x.

          + Sets the hostname that will be given to services-admins when they set +x. You may + optionally specify a username@host for this value.

          set::hosts::netadmin <netadmin-host-name>;
          - Sets the hostname that will be given to netadmins when they set +x.

          + Sets the hostname that will be given to netadmins when they set +x. You may + optionally specify a username@host for this value.

          set::hosts::host-on-oper-up <yes/no>;
          If set to yes, the H/get_host flag will be honored and +x will be automatically set at /oper. If set to no, the user must set +x manually to receive the oper diff --git a/doc/unreal32docs.hu.html b/doc/unreal32docs.hu.html index 3de649a8f..ca089a4dd 100644 --- a/doc/unreal32docs.hu.html +++ b/doc/unreal32docs.hu.html @@ -19,13 +19,17 @@ -English | German | -Spanish | Hungarian

          +English | +German | +Spanish | +Hungarian | +French +

          UnrealIRCd
          http://www.unrealircd.com
          -  Verzió: 3.2.1
          -  Jelenlegi verzió: 3.2.1
          -  Utolsó módosítás: 2004-07-03
          +  Verzió: 3.2.2
          +  Jelenlegi verzió: 3.2.2
          +  Utolsó dokumentáció módosítás: 2004-10-11
          Fõ fejlesztõk: Stskeeps / codemastr / Syzop / Luke
          Munkatársak: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
          @@ -149,15 +153,15 @@

          A frissítés javasolt módja:
          Linux:

            -
          • Nevezd át a régi UnrealIRCd könyvtáradat! (Máskülönben felül fogod írni a következõ lépésben.) -
          • Csomagold ki az új UnrealIRCd verziót, valamint futtasd a ./Config és a make parancsot! -
          • Másold a régi konfigurációs fájlokat az új könyvtárba! (unrealircd.conf, motd, szabályok, server.* [SSL tanúsítványok], hálózati fájl, stb.)

          +
        8. Nevezd át a régi UnrealIRCd könyvtáradat. (Máskülönben felül fogod írni a következõ lépésben.) +
        9. Csomagold ki az új UnrealIRCd verziót, valamint futtasd a ./Config és a make parancsot. +
        10. Másold a régi konfigurációs fájlokat az új könyvtárba. (unrealircd.conf, motd, szabályok, server.* [SSL tanúsítványok], hálózati fájl stb.)

          Windows:
            -
          • Másold át minden konfigurációs fájlodat egy ideiglenes helyre! -
          • Távolítsd el az összes elõzõleg telepített Unreal verziót! -
          • Futtasd az Unreal új verziójának telepítõjét! -
          • Másold a régi konfigurációs fájlokat az új könyvtárba! +
          • Másold át minden konfigurációs fájlodat egy ideiglenes helyre. +
          • Távolítsd el az összes elõzõleg telepített Unreal verziót. +
          • Futtasd az Unreal új verziójának telepítõjét. +
          • Másold a régi konfigurációs fájlokat az új könyvtárba.

          Kérlek, a .RELEASE.NOTES-t is olvasd el, hogy lásd, milyen változások történtek. Ha bármilyen változást tapasztalsz (vagy hibát) a régi és új verziók között, FELTÉTLENÜL OLVASD EL A KIADÁSI JEGYZÉKET, mielõtt hibaként jelented!

          @@ -187,25 +191,25 @@ Windows:

          Ha van egy mûködõ Unreal3.2-d más operációs rendszereken, kérlek, küldd - a részleteket a docs@unrealircd.com címre!
          + a részleteket a docs@unrealircd.com címre.

          Telepítési útmutatások
          Linux:

            -
          1. gunzip -d Unreal3.2.tar.gz -
          2. tar xvf Unreal3.2.tar +
          3. gunzip -d Unreal3.2.2.tar.gz +
          4. tar xvf Unreal3.2.2.tar
          5. cd Unreal3.2
          6. ./Config -
          7. Válaszolj ezekre a kérdésekre a legjobb tudásod szerint! Általában, ha nem vagy biztos +
          8. Válaszolj ezekre a kérdésekre a legjobb tudásod szerint. Általában, ha nem vagy biztos a válaszban, az alapértelmezett érték is pont jó!
          9. make -
          10. Most hozd létre az unrealircd.conf-odat és más konfigurációs fájlokat, lásd a 4. részt! +
          11. Most hozd létre az unrealircd.conf-odat és más konfigurációs fájlokat, lásd a 4. részt.

          Windows:

            -
          1. Futtasd az Unreal telepítõt! -
          2. Most hozd létre az unrealircd.conf-odat és más konfigurációs fájlokat, lásd a 4. részt! +
          3. Futtasd az Unreal telepítõt. +
          4. Most hozd létre az unrealircd.conf-odat és más konfigurációs fájlokat, lásd a 4. részt.

          @@ -217,7 +221,7 @@ Windows:

          3.1 - Álcázás

          Az álcázás (cloaking) egy módszer a felhasználók valós gazdaneveinek elrejtésére. Például, ha a valódi gazdaneved d5142341.cable.wanadoo.nl, - (a join, part, whois, stb. üzenetekben) rox-2DCA3201.cable.wanadoo.nl-ként lesz megjelenítve. + (a join, part, whois stb. üzenetekben) rox-2DCA3201.cable.wanadoo.nl-ként lesz megjelenítve. Ez a featúra hasznos annak a megelõzésére, hogy a felhasználók egymást floodolják, mivel nem látják a valódi gazdanevet ill. IP címet.

          Ez a +x felhasználói móddal vezérelhetõ (például: /mode nickneved +x), az adminok erõltethetik a +x alapértelemzésbeli engedélyezését is, vagy beállíthatják, hogy a mód soha ne legyen eltávolítható.

          @@ -236,7 +240,7 @@ Windows:
          - Betölthetsz, újratöltetsz és eltávolíthatsz modulokat, miközben az ircd fut (a /rehash-sel). Így hibákat lehet javítani illetve új dolgokat hozzáadni az újraindítás szükségessége nélkül!
          - Mások készíthetnek (nem hivatalos, angol nevén: 3rd party) modulokat, amelyek új parancsokat, felhasználói és akár csatornamódokat is tartalmazhatnak.
          Az UnrealIRCd önmagában csak egy kevés modullal rendelkezik. Vess egy pillantást a www.unrealircd.com -> modules - oldalára, vagy használd a google keresõt nemhivatalos modulok keresésére!
          + oldalára, vagy használd a google keresõt nemhivatalos modulok keresésére.

          Legalább 2 modult be kell töltened, különben az ircd nem fog elindulni!
          - a commands modult: commands.so (commands.dll windows alatt)
          - egy álcázó modult: rendszerint cloak.so (cloak.dll windows alatt).

          @@ -261,7 +265,8 @@ Windows:
          N - távoli névváltásokról szóló értesítések
          q - letiltott (Q:line-os) nevek visszautasításáról szóló értesítések
          s - egyéb szerverüzenetek [*]
          -   S - spamfilter értesítések
          + S - spamfilter értesítések
          + o - /oper-elésekrõl szóló értesítések
          [*: ezt a snomaskot nem csak ircopok használhatják]

          Beállíthatod, hogy milyen snomaskokat kapj meg automatikusan (set::snomask-on-connect) és melyeket operátorrá @@ -273,21 +278,21 @@ Windows:
          lefordítva, hogy "privmsg nickserv identify blah"). Ennél összetettebb álneveket is készíthetsz, mint a /register, amely a ChanServhez továbbítódik, ha az elsõ paraméter #-tel kezdõdik, és a NickServ-hez, ha nem.

          Az álnevek az alias blokkban állíthatóak be a konfigurációs fájlban, és egy külön fájlt is betölthetsz, amely - alapértelmezett álneveket tartalmaz a leggyakrabban használt servicesekhez.

          + alapértelmezett álneveket tartalmaz a leggyakrabban használt szolgáltatásokhoz.

          3.5 - Helpop

          Az UnrealIRCd rendelkezik egy beépített súgórendszerrel, ami elérhetõ a /helpop-pal. A /helpop parancs teljes mértékben - konfigurálható a help block konfigurációs fájlban. Ezenkívül van hozzá egy help.conf fájl is, amelyben az összes parancsról + konfigurálható a help blokkal a konfigurációs fájlban. Ezenkívül van hozzá egy help.conf fájl is, amelyben az összes parancsról található alapvetõ tájékoztatás.
          Például a /helpop chmodes egy áttekintést ad az UnrealIRCd összes csatornamódjáról.
          Emlékezz arra, hogy ha ircop (helpop) vagy, a kulcsszó elé egy '?' karaktert kell tenni, tehát a /helpop helyett /helpop ? lesz és - a /helpop chmodes helyett /helpop ?chmodes, stb..

          + a /helpop chmodes helyett /helpop ?chmodes stb..

          3.6 - Operátori hozzáférési szintek

          Számos operátori szint létezik az UnrealIRCd-ben, és további jogokat tehetsz hozzájuk (például a /gline használatához), így minden operátornak megadhatod a szükséges jogokat.

          -

          Ezeket az oper flagekkel vezérelheted az oper blokkban; további információért lásd az oper blokkot!

          +

          Ezeket az oper flagekkel vezérelheted az oper blokkban; további információért lásd az oper blokkot.

          3.7 - Operátori parancsok

          Az UnrealIRCd egy halom rendkívül hatásos operátori paranccsal rendelkezik, amelyekre a Felhasználói @@ -302,7 +307,7 @@ Windows:
          ami érti az SSL protokollt.

          SSL-t támogató kliensek: XChat, irssi, - mIRC (6.14 és frissebb, + mIRC (6.14 és frissebb, kell hozzá néhány további lépés is).

          Azokhoz a kliensekhez, amelyek nem támogatják az SSL-t, használhatsz egy tunnelt, mint az stunnel, íme egy stunnel.conf példa (stunnel 4.x-re):
          @@ -316,7 +321,7 @@ Windows:
          6697-es portjára (egy SSL portra).

          Nem árt, ha a tanúsítványokat is érvényesíted, amikor szerverekre kapcsolódsz, és nem csak vakon elfogadod õket (mint az stunnel példában), különben továbbra is sebezhetõ maradhatsz a "tevékeny szimatolás" jellegû támadásokkal szemben, (ssl átirányítások), viszont ez túlságosan témán kívüli, - hogy itt magyarázzuk el. (Tanulj az SSL-rõl, ne minket kérdezz!) [A mIRC és az xchat megjelenít egy ablakot a tanúsítványok engedélyezésérõl/visszautasításáról, + hogy itt magyarázzuk el. (Tanulj az SSL-rõl, ne minket kérdezz.) [A mIRC és az xchat megjelenít egy ablakot a tanúsítványok engedélyezésérõl/visszautasításáról, tehát ez jó].

          3.9 - IPv6

          Az UnrealIRCd támogatja az IPv6-ot, és a beta15 óta stabilnak tûnik.
          @@ -326,13 +331,13 @@ Windows:

          3.10 - Zip linkek

          A zip linkek bekapcsolhatóak a szerver<->szerver linkekben, a zlib használatával tömörít adatokat. Megspórolhat 60-80% sávszélességet... Úgyhogy eléggé hasznos az alacsony sávszélességû linkekhez vagy olyanokhoz, - ahol nagy mennyiségû felhasználó van; sokat segíthet a linkeléskor, mert rengeteg adat küldõdik el a felhasználókról, csatornákról, stb.

          + ahol nagy mennyiségû felhasználó van; sokat segíthet a linkeléskor, mert rengeteg adat küldõdik el a felhasználókról, csatornákról stb.

          A zip link támogatással történõ fordításhoz válaszolj Yes-t a ./Config zlib-es kérdésében, valamint a konfigurációban állítsd be a - link::options::zip opciót (mindkét oldalon)!

          + link::options::zip opciót (mindkét oldalon).

          3.11 - Dinamikus DNS-sel/IP-vel linkelések támogatása

          Az UnrealIRCd néhány (új) hasznos featúrával segíti azokat a felhasználókat, akiknek dinamikus IP-jük van, és dinamikus DNS-t használnak - (mint a valami.dyndns.org). Ha két dinamikus DNS-sel rendelkezõ gépet linkelsz, állítsd be a link::options::nodnscache és a link::options::nohostcheck opciókat! + (mint a valami.dyndns.org). Ha két dinamikus DNS-sel rendelkezõ gépet linkelsz, állítsd be a link::options::nodnscache és a link::options::nohostcheck opciókat.

          3.12 - Anti-Flood featúrák

          @@ -466,8 +471,19 @@ A modulok b

          Spamszûrõk a /spamfilter paranccsal vehetõek fel, amely a következõ szintaktikát használja:
          /spamfilter [add|del|remove|+|-] [típus] [tevékenység] [idõtartam] [indok] [regex]

        11. - + @@ -505,7 +521,14 @@ lesznek alak

          Spamszûrõket a konfigurációs fájlban is felvehetsz, de ezek helyi spamszûrõk lesznek (nem hálózati szintûek, bár erre használhatod a távoli fájlok betöltését). Ezen spamfilter { } blokkok szintaktikáját itt magyarázzuk.
          -

          + Példa:
          +
          spamfilter {
          +	regex "//write \$decode\(.+\|.+load -rs";
          +	target { private; channel; };
          +	reason "Általános $decode sebezhetõség";
          +	action block;
          +};

          +

          A set::spamfilter::ban-time lehetõvé teszi, hogy módosítsd a spamszûrõk által felvett *line-ok alapértelmezett kitiltási idejét (alapértelmezés: 1 nap)
          A set::spamfilter::ban-reason-nel meghatározhatsz egy alapértelmezett indokot a *line-okra (alapértelmezés: 'Spam/advertising')
          A set::spamfilter::virus-help-channel-lel meghatározhatod, hogy milyen csatornára történjen a belépés a 'viruschan' tevékenység esetén (alapértelmezés: #help)
          @@ -572,7 +595,7 @@ fe80:0:0:123:0:0:0:0 - fe80:0:0:123:ffff:ffff:ffff:ffff).

              megjegyzés */

          Most, hogy tudod, hogyan mûködik, készítsd el a saját unrealircd.conf-odat teljesen a semmibõl, vagy - másold le a doc/example.conf-ot, és kezdd el szerkeszteni! Javasolt, hogy lépésrõl lépésre haladj + másold le a doc/example.conf-ot, és kezdd el szerkeszteni. Javasolt, hogy lépésrõl lépésre haladj át az egyes blokktípusokon, és használd ezt a kézikönyvet segédletnek.

          4.2 - Me Blokk @@ -620,7 +643,7 @@ admin { admin { "Bob Smith"; "bob"; - "widely@used.name"; + "szeleskorben@hasznalt.nev"; };

          @@ -630,8 +653,8 @@ admin {

          Szintaktika:

           class <name> {
          -	pingfreq <ping-frekvencia>;
          -	connfreq <kapcsolódási-frekvencia>;
          +	pingfreq <ping-gyakoriság>;
          +	connfreq <kapcsolódási-gyakoriság>;
           	maxclients <kliensek-maximális-száma>;
           	sendq <küldési-sor-mérete>;
           	recvq <fogadási-sor-mérete>;
          @@ -641,7 +664,7 @@ class <name> {
           

          Class blokkok azok az osztályok, amelyekben a kapcsolatok elhelyezõdnek (például az allow blokkokból vagy szerverek a link blokkokból); általában több class blokkot szokás beállítani (pl. egy-egy a szervereknek, klienseknek és az opereknek).

          A name egy leíró név, például "clients" (kliensek) vagy "servers" (szerverek), erre az osztálynévre hivatkoznak - az allow, link, oper, stb. blokkok.

          + az allow, link, oper stb. blokkok.

          A pingfreq a szerver által küldött PING-ek közötti idõ másodpercekben (egy 90 és 180 közötti érték javasolt).

          A connfreq csak szerverekre használható, és a kapcsolódási kísérletek közötti idõt jelenti másodpercekben, ha az autoconnect engedélyezve van.

          A maxclients meghatározza, hogy maximálisan (összesen) hány kliens/szerver tartozhat ebbe a kapcsolati osztályba.

          @@ -693,11 +716,11 @@ allow { beállítani, ami csak IP-re illik, de gazdanévre nem, valami érvénytelen hostnevet állíts be, mint például "hostname SENKI;".

          ip
          Az ip maszk megadási formája a user@ip, user az ident név, amely általában *, ip az IP maszk. - Példák: *@* (bárhonnan), *@192.168.* (csak 192.168-cal kezdõdõ IP címekrõl), stb.

          + Példák: *@* (bárhonnan), *@192.168.* (csak 192.168-cal kezdõdõ IP címekrõl) stb.

          host
          Hasonló a fentihez, annyi különbséggel, hogy itt a megadási forma a user@host maszk, ahol a user általában *. Példák: *@* (bárhonnan), *@*.wanadoo.fr (csak a wanadoo.fr-rõl).

          -

          password (egyéni)
          +

          password (szabadon választható)
          Jelszó megadására kötelesít. Itt megadhatsz egy jelszókódolási módot is.

          class
          @@ -706,11 +729,11 @@ allow {

          maxperip (optional, but recommended)
          Meghatározza, hogy egy IP címrõl maximum hány kapcsolatot engedélyezzen (például: maxperip 4;).

          -

          redirect-server (egyéni)
          +

          redirect-server (szabadon választható)
          Ha a kapcsolati osztály megtelt, továbbítja a felhasználókat erre a szerverre (ha a kliens támogatja [a mIRC 6 igen]).

          -

          redirect-port (egyéni)
          +

          redirect-port (szabadon választható)
          Ha a redirect-server be van állítva, itt megadhatod a portot, különben 6667 lesz feltételezve.

          -

          options block (egyéni)
          +

          options block (szabadon választható)
          Érvényes opciók:
             useip mindig IP címet jelenítsen meg gazdanév helyett
             noident ne használjon identet, hanem a kliens által megadot felhasználónevet
          @@ -728,9 +751,9 @@ allow { allow { ip *@*; - hostname *@*.passworded.ugly.people; + hostname *@*.jelszavas.csunya.emberek; class clients; - password "f00Ness"; + password "V4lami"; maxperip 1; };

          @@ -755,14 +778,14 @@ listen <ip:port> {

          ip és port
          Az ip-t beállíthatod *-ra, hogy minden hálózati eszközön figyelje a kapcsolódásokat, vagy megadhatsz IP címet, és akkor csak arra az IP címre bindel (shell szolgáltatóknál rendszerint szükséges). A port annak a portnak a száma, amelyet a szerver megnyit és figyeli rajta a kapcsolódásokat. Beállíthatsz - port tartományt is egyetlen szám helyett, például a 6660-6669 minden portot megnyit 6660-tól 6669-ig bezárólag. IPv6 felhasználók: lásd lejjebb!

          + port tartományt is egyetlen szám helyett, például a 6660-6669 minden portot megnyit 6660-tól 6669-ig bezárólag. IPv6 felhasználók: lásd lejjebb.

          Információk IPv6 felhasználóknak
          - Ha IPv6-engedélyezett szervered van, az IP címet szögletes zárójelek között add meg! - Így ki lehet kerülni a szintaktikai hibát. Példa: [::1]:6667 (a localhost 6667-es portján - fog figyelni). Ha IPv6-ot használsz és egy bizonyos IPv4 címet szeretnél használni, - ::ffff:ipv4ip formában tedd meg! Például az [::ffff:203.123.67.1]:6667 a 203.123.67.1-es - címen, a 6667-es porton fog figyelni. Természetesen használhatsz *-ot is.

          -

          options blokk (egyéni)
          + Ha IPv6-engedélyezett szervered van, az IP címet szögletes zárójelek között add meg. + Példa: [::1]:6667 (a localhost 6667-es portján fog figyelni). Ha IPv6-ot használsz + és egy bizonyos IPv4 címet szeretnél használni, ::ffff:ipv4ip formában teheted meg. + Például az [::ffff:203.123.67.1]:6667 a 203.123.67.1-es címen, a 6667-es porton + fog figyelni. Természetesen használhatsz *-ot is.

          +

          options blokk (szabadon választható)
          Tetszés szerint beállíthatsz különbözõ opciókat ehhez a porthoz, érvényes opciók:

          [típus] meghatározza a célpont típusát; egyszerre többet is meg lehet adni: - 'c'-t a csatornabeli üzenetekhez, 'p'-t a privát üzenetekhez, 'n'-et a privát értesítésekhez, 'N'-et a csatornabeli értesítésekhez, 'P'-t a part üzenetekhez, 'q'-t a kilépõ üzenetekhez és 'd'-t a dcc-hez
          [típus] meghatározza a célpont típusát:
          + + + + + + + + + + +
          Karakter:Konfigurációs elem:Leírás:
          cchannelCsatornabeli üzenet
          pprivatePrivát üzenet (két felhasználó között)
          nprivate-noticePrivát értesítés
          Nchannel-noticeCsatornabeli értesítés
          PpartCsatornáról lelépés indoka
          qquitKilépési indok
          ddccDCC fájlnév
          uuserFelhasználó kitiltása, nick!user@host:valósnév alakú illeszkedési maszk
          + Egyszerre több célpontot is megadhatsz, például így: cpNn
          [tevékenység] meghatározza az elvégzendõ tevékenységet (csak 1 tevékenység adható meg)
          @@ -479,8 +495,8 @@ A modulok b - +
          killkilövi a felhasználót
          gzlinegzline-t (globális zline-t) helyez a hostra
          blockcsak blokkolja az üzenetet
          dccblockmegjelöli a felhasználót DCC blokkolásra (nem küldhet DCC-ket)
          viruschanminden csatornáról lelépteti, belépteti a set::spamfilter::virus-help-channel csatornára, letilt minden parancsot, - kivéve a PONG-ot, az ADMIN-t és a set::spamfilter::virus-help-channel csatornára küldött üzeneteket/értesítéseket
          viruschanlelépteti a felhasználót minden csatornáról, belépteti a set::spamfilter::virus-help-channel csatornára, letilt minden parancsot, + kivéve a PONG-ot, az ADMIN-t és a set::spamfilter::virus-help-channel csatornára küldött üzeneteket/értesítéseket
          [idõtartam] A szûrõ által felvett *line-ok idõtartama, használj kötõjelet ('-') az alapértelmezéshez vagy a kihagyáshoz (pl.: ha a tevékenység = 'block')
          @@ -805,6 +828,7 @@ listen *:6601 { }; swhois <whois info>; snomask <snomask>; + modes <módok>; maxlogins <szám>; };

          @@ -815,7 +839,7 @@ listen *:6601 { az a jelszó, amit a felhasználónak meg kell adnia, az oper::password:: segítségével kódolhatod a jelszót, érvényes hitelesítési típusok: crypt, md5, sha1, ripemd-160. Ha csak egyszerû szöveg típusú jelszót szeretnél megadni, az alblokkot kihagyhatod.

          -

          Megjegyzendõ, hogy MIND a bejelentkezõ név és jelszó a kis- és nagybetûkre érzékenyek!

          +

          Megjegyzendõ, hogy MIND a bejelentkezõ név és jelszó a kis- és nagybetûkre érzékenyek.

          Az oper::class direktíva meghatározza azt a már létezõ (a konfigurációban ezen blokk elõtt beállított) osztálynevet, amit az oper blokk használ.

          Az oper::flags direktívának kétféle formája van. Ha a régi stílusú oper flageket szeretnéd @@ -1104,13 +1128,15 @@ listen *:6601 {

          clientsonly
          ezen a porton csak kliensek kapcsolódhatnak

          Az oper::swhois direktívával egy tetszõleges szövegû sorral egészítheted ki az operátor - whois információját. [egyéni]

          -

          Az oper::snomask direktívával elõre meghatározhatod egy operátor szerverüzenet-maszkját, - amely opereléskor lesz beállítva rajta. A rendelkezésre álló SNOMASKok listáját lásd a - 3.3. szekcóban! [egyéni]

          + whois információját. [szabadon választható]

          +

          Az oper::snomask direktívával elõre beállíthatod, hogy az operátor milyen + szerverüzenet-maszkokat kapjon opereléskor. A rendelkezésre álló SNOMASKok listáját lásd a + 3.3. szekcóban. [szabadon választható]

          +

          Az oper::modes direktívával elõre beállíthatod, hogy az operátor milyen módokat kapjon opereléskor. +  [szabadon választható]

          Az oper::maxlogins direktívával lekorlátozhatod az egyidejû oper bejelentkezések számát errõl a login névrõl, például ha 1-re állítod, csak 1 személy lehet operátor ezzel a blokkal egyszerre. - [egyéni]

          + [szabadon választható]

          Példa:

          @@ -1120,7 +1146,7 @@ oper bobsmith {
           		userhost bob@smithco.com;
           		userhost boblaptop@somedialupisp.com;
           	};
          -	password "f00";
          +	password "v4lami";
           	flags {
           		netadmin;
           		can_gkline;
          @@ -1130,7 +1156,7 @@ oper bobsmith {
           		can_die;
           		global;
           	};
          -	swhois "Example of a whois mask";
          +	swhois "Példa egy whois maszkra";
           	snomask frebWqFv;
           };
           

          @@ -1149,15 +1175,15 @@ drpass { restart <újraindítási-jelszó> { <hitelesítés-típusa>; }; die <leállítási-jelszó> { <hitelesítés-típusa>; }; };

          -

          Ez a blokk állítja be a /restart és /die jelszavakat sorban a drpass::restart és a drpass::die +

          Ez a blokk állítja be a /restart és /die jelszavakat rendre a drpass::restart és a drpass::die direktívákkal. A drpass::restart:: és drpass::die:: lehetõséget ad a jelszavak hitelesítési típusának meghatározására. A jelenleg támogatott hitelesítési típusok a crypt, md5, sha1 és ripemd-160.

          Példa:

           drpass {
          -	restart "I-love-to-restart";
          -	die "die-you-stupid";
          +	restart "Imadok-ujrainditani";
          +	die "Halj-te-buta";
           };
           

          @@ -1178,7 +1204,7 @@ drpass {

          2. példa: álparancsok

          include aliases/ircservices.conf

          Egy másik példa alias blokkok betöltésére, az UnrealIRCd-vel együtt jön - néhány fájl, ami(nek kellene, hogy) tartalmazza a megfelelõ álparancsokat a legtöbb services programhoz:
          + néhány fájl, ami(nek kellene, hogy) tartalmazza a megfelelõ álparancsokat a legtöbb szolgáltatás programhoz:

          • aliases/ircservices.conf (IRCServices, Daylight)
          • aliases/epona.conf (Epona) @@ -1212,7 +1238,7 @@ loadmodule "modules/cloak.dll";

            4.11 - Log Blokk - EGYÉNI

            + SZABADON VÁLASZTHATÓ

            Szintaktika:

            @@ -1242,8 +1268,8 @@ log <f
               
          server-connectsnaplózza a szerverek kapcsolódásait/kilépéseit
          klinenaplózza a /kline használatokat
          opernaplózza az operelési kísérleteket (a sikerteleneket és a sikereseket is)
          sadmin-commandsnaplózza a /sa* (samode, sajoin, sapart, stb.) használatokat
          chg-commandsnaplózza a /chg* (chghost, chgname, chgident, etc.) használatokat
          sadmin-commandsnaplózza a /sa* (samode, sajoin, sapart stb.) használatokat
          chg-commandsnaplózza a /chg* (chghost, chgname, chgident stb.) használatokat
          oper-overridenaplózza az operoverride-ok használatát
          spamfilternaplózza a spamszûrõk találatait
          @@ -1264,7 +1290,7 @@ log ircd.log {

    4.12 - TLD Blokk - EGYÉNI (Elõzõleg T:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg T:Line néven ismert)

    Szintaktika:

    @@ -1281,9 +1307,9 @@ tld {
     

    A tld blokkal motd-ket, szabályokat és egy csatornát rendelhetsz felhasználókhoz a hostjaik alapján. Ez hasznos, ha különbözõ motd-t szeretnél különbözõ nyelvekhez. A tld::mask egy user@host maszk, amire a felhasználó usernevének és hostnevének - illenie kell. A tld::motd, a tld::shortmotd és a tld::rules sorban + illenie kell. A tld::motd, a tld::shortmotd és a tld::rules rendre azokat az motd, shortmotd és rules fájlokat határozzák meg, amelyek erre a hostmaszkra vonatkoznak. - A tld::shortmotd egyéni. A tld::channel szintén, ez utóbbival egy olyan csatornanevet + A tld::shortmotd szabadon választható. A tld::channel szintén, ez utóbbival egy olyan csatornanevet határozhatsz meg, ahová a felhasználó kapcsolódáskor lesz beléptetve. Ha ez meg van adva, felülbírálja az alapértelmezett auto join csatornát. A tld::options blokkal további követelményeket állíthatsz be; @@ -1299,7 +1325,7 @@ tld { };

    4.13 - Ban Nick Blokk - EGYÉNI (Elõzõleg Q:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg Q:Line néven ismert)

    Szintaktika:

    @@ -1315,11 +1341,11 @@ ban nick {
     ban nick {
     	mask "*C*h*a*n*S*e*r*v*";
    -	reason "Reserved for Services";
    +	reason "Fenntartva a szolgáltatásoknak";
     };

    4.14 - Ban User Blokk - EGYÉNI (Elõzõleg K:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg K:Line néven ismert)

    Szintaktika:

    @@ -1335,11 +1361,11 @@ ban user {
     
     ban user {
     	mask *tirc@*.saturn.bbn.com;
    -	reason "Idiot";
    +	reason "Idióta";
     };

    4.15 - Ban IP Blokk - EGYÉNI (Elõzõleg Z:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg Z:Line néven ismert)

    Szintaktika:

    @@ -1355,11 +1381,11 @@ ban ip {
     
     ban ip {
     	mask 192.168.1.*;
    -	reason "Get a real ip u lamer!";
    +	reason "Szerezz egy valós IP-t, te béna!";
     };

    4.16 - Ban Server Blokk - EGYÉNI (Elõzõleg q:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg q:Line néven ismert)

    Szintaktika:

    @@ -1376,11 +1402,11 @@ ban server {
     
     ban server {
     	mask broken.server.my.network.com;
    -	reason "Its broken!";
    +	reason "Törött!";
     };

    4.17 - Ban RealName Blokk - EGYÉNI (Elõzõleg n:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg n:Line néven ismert)

    Szintaktika:

    @@ -1397,11 +1423,11 @@ ban realname {
     
     ban realname {
     	mask "Bob*";
    -	reason "Bob sucks!";
    +	reason "Bob egy szívás!";
     };

    4.18 - Ban Version Blokk - EGYÉNI

    + SZABADON VÁLASZTHATÓ

    Szintaktika:

    @@ -1423,19 +1449,19 @@ ban version {
     

    Példa:

     ban version {
    -	mask "*SomeLameScript*";
    -	reason "SomeLameScript contains backdoors";
    +	mask "*ValamilyenBenaScript*";
    +	reason "A ValamilyenBenaScript kiskapukat tartalmaz";
     };
     ban version {
     	mask "*w00tZombie*";
    -	reason "I hate those hundreds of zombies";
    +	reason "Utálom azt a sok száz zombit";
     	action zline;
     };

    4.19 - Ban Exceptions Blokk - EGYÉNI (Elõzõleg E:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg E:Line néven ismert)

    Szintaktika:

    @@ -1443,40 +1469,46 @@ except ban {
     	mask <hostmaszk>;
     };

    Az except ban blokkal határozhatod meg, mely user@host-ok bírálhatnak felül egy szélesebb maszkra - beállított letiltást. Hasznos, ha egy Internet szolgáltató ki van tiltva, de + beállított kitiltást. Hasznos, ha egy Internet szolgáltató ki van tiltva, de onnan bizonyos felhasználókat még mindig szeretnél kapcsolódni engedni. Az except::mask direktíva a kapcsolódásra engedélyezett kliens user@host maszkját határozza meg.

    Példa:

     except ban {
    -	mask myident@my.isp.com;
    +	mask identnev@sajat.szolgaltatom.com;
     };

    4.20 - TKL Exceptions Blokk - EGYÉNI

    + SZABADON VÁLASZTHATÓ

    Szintaktika:

     except tkl {
     	mask <hostmaszk>;
     	type <típus>;
    +	type { 
    +		<típus>;
    +		<típus>;
    +		...
    +	};
     };

    -

    Az except tkl blokkal szélesebb hostra illõ maszkon beállított tkl banok felülbírálását - engedélyezeted bizonyos user@host-okra. Hasznos, ha egy Internet szolgáltató ki van tiltva, +

    Az except tkl blokkal meghatározhatod, mely user@host-ok bírálhatnak felül egy szélesebb + maszkra beállított tkl kitiltást. Hasznos, ha egy Internet szolgáltató ki van tiltva, de még mindig szeretnéd, hogy onnan kapcsolódhassanak bizonyos felhasználók. Az except::mask direktíva a kapcsolódásra engedélyezett felhasználó user@host maszkja. Az except::type meghatározza, hogy milyen letiltást bírálhat felül a kliens. Érvényes típusok: gline, gzline, qline, gqline és shun, amelyek kivételt képeznek a Gline-okra, globális Zline-okra, - Qline-okra, globális Qline-okra és shunokra.

    + Qline-okra, globális Qline-okra és shunokra. Ha a type {} formátumot használod, + több típust is megadhatsz.

    Példa:

     except tkl {
    -	mask myident@my.isp.com;
    +	mask identnev@sajat.szolgaltatom.com;
     	type gline;
     };

    4.21 - Throttle Exceptions Blokk - EGYÉNI + SZABADON VÁLASZTHATÓ

    Szintaktika:

    @@ -1493,7 +1525,7 @@ except throttle {
     };

    4.22 - Deny DCC Blokk - EGYÉNI (Elõzõleg dccdeny.conf-ként ismert) + SZABADON VÁLASZTHATÓ (Elõzõleg dccdeny.conf-ként ismert)

    Szintaktika:

    @@ -1502,13 +1534,13 @@ deny dcc {
     	reason <letiltás-indoka>;
     	soft [yes|no];
     };

    -

    A deny dcc blokkal határozhatsz meg fájlneveket, amelyek a szerveren nem - engedélyezettek DCC-n keresztüli küldésre. Ez nagyon hasznos a trójai lovak és vírusok +

    A deny dcc blokkal megadhatod olyan fájlok nevét, amelyek nem engedélyezettek + a szerveren DCC-n keresztüli küldésre. Ez nagyon hasznos a trójai lovak és vírusok terjesztésének megállítására.

    A deny::filename paraméter egy joker karaktereket megengedõ maszk annak a fájlnak a nevére, amelynek a küldése letiltandó, és a deny::reason adja meg az indokot, hogy a fájl miért van blokkolva.

    Van még egy deny::soft opció is (gyenge letiltás); ha "yes"-re állítod, a dcc mindaddig blokkolva lesz, - mígnem a felhasználó kifejezetten engedélyezi a /DCCALLOW +küldõ-nickneve paranccsal. + mígnem a felhasználó kimondottan engedélyezi a /DCCALLOW +küldõ-nickneve paranccsal.   A dccallow.conf-ban találhatsz egy jó példát dccallow konfigurációra.

    Példa:

    @@ -1525,7 +1557,7 @@ deny dcc {
     

    4.23 - Deny Version Blokk - EGYÉNI (Elõzõleg V:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg V:Line néven ismert)

    Szintaktika:

    @@ -1546,13 +1578,13 @@ deny version {
       a nála kisebb verziók tiltottak, ha =, csak az a verzió tiltott, és ha
       !, a megadottat kivéve minden verzió tiltott. A deny::flags direktívával
       meghatározhatod, hogy milyen fordításidejû opciókat reprezentáló flagei lehetnek vagy
    -  nem lehetnek a szervernek. A flagek legyenek egymás mellett, elválasztás nélkül! Ha egy
    +  nem lehetnek a szervernek. A flagek legyenek egymás mellett, elválasztás nélkül. Ha egy
       karaktert megelõz egy !, akkor az azt jelenti, hogy ez a flag nem szerepelhet a szerver
       fordítási flagjei között, ha pedig nincs elõtte ! prefix, akkor a szervernek kell, hogy
       legyen ilyen flagje.

    4.24 - Deny Link Blokk - EGYÉNI (Elõzõleg D/d:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg D/d:Line néven ismert)

    Szintaktika:

    @@ -1579,7 +1611,7 @@ deny link {
       (minden kapcsolódási kísérletre érvényes).

    4.25 - Deny Channel Blokk - EGYÉNI (Elõzõleg chrestrict.conf-ként ismert) + SZABADON VÁLASZTHATÓ (Elõzõleg chrestrict.conf-ként ismert)

    Szintaktika:

    @@ -1619,7 +1651,7 @@ deny channel {
     
     

    4.26 - Allow Channel Blokk - EGYÉNI + SZABADON VÁLASZTHATÓ

    Szintaktika:

    @@ -1636,7 +1668,7 @@ allow channel {
     };

    4.27 - Allow DCC Blokk -   EGYÉNI +   SZABADON VÁLASZTHATÓ

    Szintaktika:

    @@ -1655,7 +1687,7 @@ allow dcc {
     };

    4.28 - Vhost Blokk - EGYÉNI (Elõzõleg vhosts.conf-ként ismert) + SZABADON VÁLASZTHATÓ (Elõzõleg vhosts.conf-ként ismert)

    Szintaktika:

    @@ -1694,7 +1726,7 @@ vhost {
     };

    4.29 - Badword Blokk - EGYÉNI (Elõzõleg badwords.*.conf-ként ismert) + SZABADON VÁLASZTHATÓ (Elõzõleg badwords.*.conf-ként ismert)

    Szintaktika:

    @@ -1721,7 +1753,7 @@ badword channel {
     };

    4.30 - ULines Blokk - EGYÉNI (Elõzõleg U:Line néven ismert)

    + SZABADON VÁLASZTHATÓ (Elõzõleg U:Line néven ismert)

    Szintaktika:

    @@ -1742,7 +1774,7 @@ ulines {
     };

    4.31 - Link Blokk - EGYÉNI (Elõzõleg C/N/H:Line-okként ismert) + SZABADON VÁLASZTHATÓ (Elõzõleg C/N/H:Line-okként ismert)

    Szintaktika:

    @@ -1757,6 +1789,7 @@ link <szervern
     	leaf <leaf-maszk>;
     	leafdepth <mélység>;
     	class <osztálynév>;
    +	ciphers <ssl-kódoló-algoritmusok>;
     	options {
     		<opció>;
     		<opció>;
    @@ -1768,7 +1801,7 @@ link <szervern
     

    Elõször is, a szervernév a távoli szervered neve, az a név, amely a távoli szerver me { } blokkjában van beállítva, mint a hub.blah.com (nem az IP cím, és a gazdanévtõl is eltérõ lehet).

    username
    - Megadhatod ezt, ha identet használsz a felhasználónevek hitelesítésre, közönséges esetben állítsd "*"-ra! + Megadhatod ezt, ha identet használsz a felhasználónevek hitelesítésre, közönséges esetben állítsd "*"-ra.

    hostname
    A távoli szerver gazdaneve vagy IP címe. Ezt használjuk a kapcsolódáshoz ÉS a beérkezõ oldal @@ -1781,7 +1814,7 @@ link <szervern ::ffff:1.2.3.4 ipv6-ról ipv4-re linkeléshez.

    -

    bind-ip (egyéni)
    +

    bind-ip (szabadon választható)
    Arra használható, hogy a szerver egy megadott IP-re bindeljen (pl. 192.168.0.1-re), ahonnan kellene kapcsolódnia, szinte soha nincs szükség rá.

    @@ -1800,21 +1833,25 @@ link <szervern A hub linkelhet egyszerre több szervert is, amíg a leafnek csak egy linkje lehet... hozzád. Egy szerver vagy hub, vagy leaf, ezek együtt nem használhatóak.

    -

    hub (egyéni)
    +

    hub (szabadon választható)
    Az értéke egy maszk azokra a szerverekre, amelyekre ez a hub kapcsolódhat (pl: *.sajat.net).

    -

    leaf (egyéni)
    +

    leaf (szabadon választható)
    Az értéke egy maszk azokra a szerverekre, amelyek felé ez a szerver leafként viselkedik.

    -

    leaf-mélység (egyéni)
    - Ha ezt megadod, a leaf opciót is célszerû megadnod. The value specifies the depth - (number of hops) this server may have beneath it. +

    leaf-mélység (szabadon választható)
    + Ha ezt megadod, a leaf opciót is célszerû megadnod. Ez az érték azt a mélységet + (ugrások számát) határozza meg, amely alá ez a szerver nem léphet.

    class
    Azon kapcsolati osztály, ahová helyezzük a szervert. Ehhez gyakran egy külön szerver osztályt szokás használni.

    -

    compression-level (egyéni)
    - Megadja ezen link tömörítési szintjét (1-9). Csak akkor használatos, ha a link::options::zip be van állítva. +

    compression-level (szabadon választható)
    + Megadja ezen link tömörítési szintjét (1-9). Csak akkor szokás használni, ha a link::options::zip be van állítva. +

    +

    ciphers (szabadon választható)
    + Meghatározza, milyen SSL kódoló/visszafejtõ algoritmusok (cipherek) legyenek használatban ehhez a linkhez. A rendelkezésre álló + algoritmusok listájának eléréséhez használd az `openssl ciphers` parancsot. Az algoritmusokat ":"-tal elválasztott felsorolásként add meg.

    options blokk
    Egy vagy több opció használatának beállítására szolgál. Néha nincs szükség rá.
    @@ -1824,9 +1861,9 @@ link <szervern beállított idõközönként (a legjobb, ha ezt csak egy oldalról engedélyezed, mint a leaf->hub linkeléseknél) zip ha tömörített (zip) linkeket akarsz; ehhez szükség van a szerverbe belefordítt zip link támogatásra + ezen opció beállítására mindkét oldalon nodnscache ne használjon gyorsítótárat a kimenõ szerverkapcsolat IP címére; használd ezt gyakran változó - gazdanevek (például dyndns.org) esetén! + gazdanevek (például dyndns.org) esetén. nohostcheck ne érvényesítse a távoli gazdanevet (link::hostname); használd ezt gyakran változó - gazdanevek (például dyndns.org) esetén! + gazdanevek (például dyndns.org) esetén. quarantine az operátorok ezen a szerveren helyi operátorokként funkcionálnak

    @@ -1849,28 +1886,29 @@ link hub.sajatnet.com { };

    4.32 - Alias Blokk - EGYÉNI + SZABADON VÁLASZTHATÓ

    Szintaktika [szabványos álparancsokra]:

     alias <név> {
    -	nick <nick-ahová-továbbítsa>;
    +	target <ahová-továbbítsa>;
     	type <álparancs-típusa>;
     };

    -

    (Megjegyzés: lásd még az include direktívát az UnrealIRCd szabványos álparancsokat tartalmazó fájljairól!)

    +

    (Megjegyzés: lásd még az include direktívát az UnrealIRCd szabványos álparancsokat tartalmazó fájljairól.)

    Az alias blokk [szabványos álparancsokra] lehetõvé teszi, hogy parancsokat továbbíts egy felhasználóhoz, például hogy a /chanserv üzenetet küldjön a chanserv felhasználónak. - Az alias:: meghatározza azon parancs nevét, ami lesz az álnév (pl.: chanserv). - Az alias::nick az a nicknév, ahová a parancs továbbítva lesz. Ha az alias:: ugyanaz, - mint a nicknév, az alias::nick elhagyható. Az alias::type meghatározza az álparancs - típusát; érvényes típusok: services (a felhasználó egy services szerveren van), stats - (a felhasználó egy stats szerveren van) és normal (a felhasználó egy közönséges felhasználó - bármilyen szerveren). Az alias blokknak van más célja is, amit az alábbiakban magyarázunk el.

    + Az alias:: meghatározza azt a parancsnevet, ami lesz az álnév (pl.: chanserv). + Az alias::target egy nick- vagy csatornanév, ahová a parancs továbbítva lesz. Ha az alias:: ugyanaz, + mint a továbbítási célpont, az alias::target elhagyható. Az alias::type meghatározza + az álparancs típusát; érvényes típusok: services (a felhasználó egy szolgáltatás szerveren van), stats + (a felhasználó egy statisztikai szerveren van), normal (a felhasználó egy közönséges felhasználó + bármilyen szerveren), és channel (a célpont egy csatornanév). Az alias blokknak van más célja is, + amit az alábbiakban magyarázunk el.

    Szintaktika [formázott álparancsokra]:

     alias <név> {
     	format <reguláris-kifejezés> {
    -		nick <nick-ahová-továbbítsa>;
    +		target <ahová-továbbítsa>;
     		type <álparancs-típusa>;
     		parameters <paraméter-sztring>;
     	};
    @@ -1884,19 +1922,20 @@ alias <n
       ugyanaz, mint fent, az álparancs neve. Az alias::format blokkok értékei reguláris kifejezések,
       amelyek az álparancshoz küldött szöveggel lesznek összehasonlítva, és ha az egyik illik rá,
       annak az alias::format-nak az albejegyzései lesznek használatban. Lehet egyszerre több
    -  alias::format-od is, hogy a parancs különbözõ dolgokat tegyen a neki küldött szövegtõl függõen.
    -  Az alias::format::nick egy nicknév, ahová az álparancs továbbításra kerül. Az
    -  alias::format::type meghatározza az elõbbi nicknevû felhasználó típusát.
    +  alias::format-od is, hogy a parancs különbözõ dolgokat tegyen a neki küldött szövegtõl
    +  függõen. Az alias::format::target az álparancs továbbításának célpontja.
    +  Az alias::format::type meghatározza az elõbbi nicknevû felhasználó típusát.
       Az alias::format::parameters az, ami megmondja, milyen paraméterek legyenek elküldve
       a felhasználóhoz. Hogy hivatkozz az álparancshoz küldött paraméterek egyikére,
       írj egy % jelet egy azt követõ számmal, például %1 az elsõ paraméter. Lehetõséged van arra is,
       hogy hivatkozz egy adott paramétertõl kezdõdõen az üzenet végéig tartó összes paraméterre,
       ehhez írj be egy % jelet, majd egy számot és egy - jelet, például a %2- visszaadja az összes
    -  paramétert a másodiktól kezdõdõen az utolsóig. A formázott álparancsokra vonatkozóan példákat
    -  találhatsz a doc/example.conf-ban.

    + paramétert a másodiktól kezdõdõen az utolsóig. Hasonló különleges célt szolgál még a %n is, + amit helyettesíteni fog annak a felhasználónak a neve, aki kiadta a parancsot. A formázott + álparancsokra vonatkozóan példákat találhatsz a doc/example.conf-ban.

    4.33 - Help Blokk - EGYÉNI + SZABADON VÁLASZTHATÓ

    Szintaktika:

    @@ -1914,7 +1953,7 @@ help <n
     

    4.34 - Official Channels Blokk - EGYÉNI + SZABADON VÁLASZTHATÓ

    Szintaktika:

    @@ -1935,11 +1974,11 @@ official-channels {
     

    4.35 - Spamfilter Blokk - EGYÉNI + SZABADON VÁLASZTHATÓ

    A spamfilter blokkal vehetsz fel helyi spamszûrõket (nem hálózati szintûeket).
    -Lásd a Featúrák - A spamszûrõ szekciót további információért!
    +Lásd a Featúrák - A spamszûrõ szekciót további információért.

    Szintaktika:

    @@ -1951,9 +1990,8 @@ spamfilter {
     	ban-time <idõtartam>;
     };

    A regex egy reguláris kifejezés, amely alapján keresünk.
    - A target meghatározza, hol történjen a szûrés, lehetséges célpontok: channel, private, private-notice, - channel-notice, part, quit, dcc.
    - Az action eldönti, mit történjen találat esetén, lásd itt a lehetséges tevékenységek listáját!
    + A target meghatározza, hol történjen a szûrés; lásd itt a célpontok lehetséges típusait (példa: "channel").
    + Az action eldönti, mi történjen találat esetén, lásd itt a lehetséges tevékenységek listáját (példa: "gline").
    A reason kihagyható, a kitiltás vagy a blokkolás indoklószövegének beállítására szolgál; ha nincs megadva, az alapértelmezés lesz használatban.
    A ban-time sem kötelezõ, megadja a *line kitiltások lejárati idejét; ha kihagyod, az alapértelmezés lesz használatban (1 nap).

    @@ -1991,7 +2029,7 @@ spamfilter { Az alábbiakban megtalálod az összes rendelkezésre álló set direktívát.

    Ebben a dokumentumban a beállításokra / direktívákra a <blokknév>::<blokk-direktíva> formában hivatkozunk. Ez NEM az a formátum, amelyet beírhatsz a beállításfájlba! - Át KELL alakítanod az alábbi példa szerint! Azért jelenítjük meg õket ebben a formában, + Át KELL alakítanod az alábbi példa szerint. Azért jelenítjük meg õket ebben a formában, hogy könnyebben beszélhessünk róluk.

    Szintaktika:

    @@ -2038,25 +2076,25 @@ set {
     

    set::modes-on-join <+módok>;
    Azok a módok, amelyek akkor lesznek beállítva egy csatornán, amikor létrehozzák. Nem minden mód állítható be ezzel az utasítással. A +qaohvbeOAzlLk módok NEM állíthatóak be ezzel az utasítással.

    set::restrict-usermodes <módok>
    - Korlátozza a felhasználókat az itt felsorolt csatornamódok beállításában/törlésében. (Ne használj + vagy - jelet!)
    + Korlátozza a felhasználókat az itt felsorolt csatornamódok beállításában/törlésében. (Ne használj + vagy - jelet.)
    Például beállíthatod a "+G"-t a "modes-on-connect"-ben és a G-t a "restrict-usermodes"-ben, ily módon minden felhasználóra ráeröltetheted a +G módot úgy, hogy ne tudják törölni.

    set::restrict-channelmodes <módok>
    - Korlátozza a felhasználókat az itt felsorolt csatornamódok beállításában/törlésében. (Ne használj + vagy - jelet!)
    + Korlátozza a felhasználókat az itt felsorolt csatornamódok beállításában/törlésében. (Ne használj + vagy - jelet.)
    Például beállíthatod a "+G"-t a "modes-on-join"-ban és a G-t a "restrict-channelmodes"-ben, ily módon minden (új) csatornára ráeröltetheted a +G módot úgy, hogy ne tudják törölni.
    - MEGJEGYZÉS: lehet, hogy ezek a csatornamódok még mindig használhatóak serviceseken keresztül - az MLOCK alkalmazásával. Sajnos mi nem tudunk sokat tenni ezügyben, a services fejlesztõket - kellene megkérned, hogy implementáljanak egy restrict-channelmodes featúrát is.

    + MEGJEGYZÉS: lehet, hogy ezek a csatornamódok még mindig használhatóak IRC szolgáltatásokon keresztül + az MLOCK alkalmazásával. Sajnos mi nem tudunk sokat tenni ezügyben, a szolgáltatás fejlesztõket + kellene megkérned, hogy megvalósítsanak egy restrict-channelmodes featúrát is.

    set::restrict-extendedbans <típusok|*>
    Nem ad engedélyt a felhasználóknak egyetlen kiterjesztett ban típus használatára sem ("*"), vagy csak bizonyos típusokat utasít vissza (pl.: "qc").

    set::auto-join <csatornák>;
    Azon csatorná(k), ahová a felhasználó be lesz léptetve kapcsolódáskor. Egynél több csatorna - megadásához használj vesszõvel elválaszott felsorolást!
    + megadásához használj vesszõvel elválaszott felsorolást.
    [Megjegyzés: ne felejts idézõjelekt hozzátenni, pl. így: auto-join "#csatorna";]

    set::oper-auto-join <csatornák>;
    Azon csatorná(k), ahová a felhasználó be lesz léptetve /oper-eléskor. Egynél több csatorna - megadásához használj vesszõvel elválasztott felsorolást!
    + megadásához használj vesszõvel elválasztott felsorolást.
    [Megjegyzés: ne felejts el idézõjeleket hozzátenni, pl. így: oper-auto-join "#csatorna";]

    set::anti-spam-quit-message-time <idõérték>;
    Egy idõérték annak az idõmennyiségnek a meghatározására, amennyit a felhasználónak el kell @@ -2069,11 +2107,11 @@ set {

    set::static-quit <kilépési-üzenet>;
    Beállít egy statikus kilépési üzenetet, amely mindannyiszor el lesz küldve, valahányszor egy kliens a hálózatból kilép. Ez szükségtelenné teszi az "anti-spam-quit-message-time"-ot éppúgy, mint - a "set::prefix-quit"-et. Ez NEM fogja a HIBAÜZENETEKET kicserélni a static-quit üzenettel!

    + a "set::prefix-quit"-et. Ez NEM fogja a HIBAÜZENETEKET kicserélni a static-quit üzenettel.

    set::static-part <no|yes|lelépési-üzenet>;
    A "yes" érték szûr minden lelépési üzenetet, a "no" értékkel a lelépések a szokásos módon mûködnek, minden más part üzenetként lesz felhasználva (pl.: static-part "Bye!"), de ez meglehetõsen idegesítõ - tud lenni, úgyhogy óvatosan használd!

    + tud lenni, úgyhogy óvatosan használd.

    set::who-limit <határ>;
    Beállítja a /who által visszaadott találatok legnagyobb megengedett számát. Ha ezt az opciót kihagyod, nem lesz korlátozás.

    @@ -2083,7 +2121,7 @@ set {

    set::oper-only-stats <flaglista>;
    Megad egy elválasztójelek nélküli, stats flagekbõl álló felsorolást, amely meghatározza, mely stats flageket használhatnak csak operátorok. Hagyd ki ezt az értéket, hogy engedélyezd a felhasználóknak az összes - flag használatát, vagy írj *-ot, hogy egy flaget se használhassanak! Itt csak rövid stats flagek adhatóak + flag használatát, vagy írj *-ot, hogy egy flaget se használhassanak. Itt csak rövid stats flagek adhatóak meg.

    set::oper-only-stats {<stats-flag>; <stats-flag>;};
    Azon stats flagek listáját határozza meg, amelyeket csak operátorok használhatnak. Ez a megadási mód csak @@ -2115,7 +2153,7 @@ set { a felhasználó által megadott felhasználónév elé egy ~ jelet tesz. Ha ezt az értéket kihagyod, nem végez ilyen ellenõrzést.

    set::options::show-connect-info;
    - Ha jelen van, az "ident lekérdezéseket", "gazdanév kikereséseket", stb. jelzõ értesítések + Ha jelen van, az "ident lekérdezéseket", "gazdanév kikereséseket" stb. jelzõ értesítések megjelennek, ha egy felhasználó kapcsolódik.

    set::options::dont-resolve;
    Ha jelen van, a beérkezõ felhasználók gazdanevei nem lesznek lekérdezve. Hasznos lehet a kapcsolódások @@ -2138,7 +2176,7 @@ set { Meghatározza a DNS lekérdezésekhez használt szerver gazdanevét.

    set::network-name <hálózat-neve>;
    Meghatározza azon hálózat nevét, amelyen ez a szerver fut. Ez az érték legyen a hálózat - minden szerverén pontosan ugyanaz!

    + minden szerverén pontosan ugyanaz.

    set::default-server <szervernév>;
    Meghatározza, hogy mi legyen annak az alapértelmezett szervernek a neve, ahová legyenek utasítva a felhasználók, ha ez a szerver tele van.

    @@ -2146,7 +2184,7 @@ set { Meghatározza azon szerver nevét, ahová a services botok kapcsolódtak. Kötelezõ; állíts be valami services.sajátnet.com-hoz hasonlóra, ha nincs servicesed.

    set::stats-server <szervernév>;
    - Beállítja azon szerver nevét, ahol a stats bot tartozkodik. Ha nem fut stats szerver, + Beállítja azon szerver nevét, ahol a statisztikai bot tartozkodik. Ha nem fut statisztikai szerver, ez az érték kihagyható.

    set::help-channel <network-help-channel>;
    Beállítja e hálózat segélycsatornájának nevét.

    @@ -2154,24 +2192,29 @@ set { Beállítja a +x gazdanevek generálásához használandó kulcsokat. Ezeknek a kulcsoknak a hálózat minden szerverén azonosnak kell lenniük, különben a szerverek nem fognak linkelni. Mind a 3 set::cloak-keys:: érték legyen egy-egy 5-100 karakterbõl álló sztring (10-20 között kiváló), amely kisbetûkbõl (a-z), - nagybetûkbõl (A-Z) és számokból (0-9) áll! Megjegyzendõ, hogy az általad betöltött álcázó modultól + nagybetûkbõl (A-Z) és számokból (0-9) áll. Megjegyzendõ, hogy az általad betöltött álcázó modultól függõen más szabályok lehetnek érvényben.

    set::hiddenhost-prefix <elõtag>;
    Meghatározza a rejtett (+x) gazdanevek elõtagját. Ez általában a hálózat nevét ábrázoló három vagy négy betû.

    set::hosts::local <locop-gazdanév>;
    - Meghatározza azt a gazdanevet, amit a +x beállításakor kapnak a helyi operátorok.

    + Meghatározza azt a gazdanevet, amit a +x beállításakor kapnak a helyi operátorok. + Igény szerint megadható egy username@host ehhez az értékhez.

    set::hosts::global <globop-gazdanév>;
    Meghatározza azt a gazdanevet, amit a +x beállításakor kapnak a globális - operátorok.

    + operátorok. Igény szerint megadható egy username@host ehhez az értékhez.

    set::hosts::coadmin <coadmin-gazdanév>;
    - Beállítja azt a gazdanevet, amit a +x beállításakor kapnak a társ-adminisztrátorok.

    + Beállítja azt a gazdanevet, amit a +x beállításakor kapnak a társ-adminisztrátorok. + Igény szerint megadható egy username@host ehhez az értékhez.

    set::hosts::admin <admin-gazdanév>;
    - Meghatározza azt a gazdanevet, amit a +x beállításakor kapnak az adminisztrátorok.

    + Meghatározza azt a gazdanevet, amit a +x beállításakor kapnak az adminisztrátorok. + Igény szerint megadható egy username@host ehhez az értékhez.

    set::hosts::servicesadmin <servicesadmin-gazdanév>;
    - Beállítja azt a gazdanevet, amit a +x beállításakor kapnak a services adminisztrátorok.

    + Beállítja azt a gazdanevet, amit a +x beállításakor kapnak a services adminisztrátorok. + Igény szerint megadható egy username@host ehhez az értékhez.

    set::hosts::netadmin <netadmin-gazdanév>;
    - Beállítja azt a gazdanevet, amit a +x beállításakor kapnak a hálózati adminisztrátorok.

    + Beállítja azt a gazdanevet, amit a +x beállításakor kapnak a hálózati adminisztrátorok. + Igény szerint megadható egy username@host ehhez az értékhez.

    set::hosts::host-on-oper-up <yes/no>;
    Ha "yes"-re állítod, a H/get_host operflag figyelembe lesz véve, és a +x automatikusan be lesz állítva /oper-eléskor. Ha "no" az értéke, a felhasználónak saját magának kell beállítania a +x módot, @@ -2218,7 +2261,7 @@ set { Árasztásvédelem névváltásokra: meghatározza, mennyi névváltás engedélyezett adott idõ alatt. Például a nick-flood 4:90 azt jelenti, 4 névváltás 90 másodpercenként. Az alapértelmezés 3 per 60.

    set::default-bantime <idõérték>
    - Az alapértelmezett kitiltási idõ, amikor a /kline, /gline, /zline, /shun, stb. parancsokat idõ paraméter nélkül használod + Az alapértelmezett kitiltási idõ, amikor a /kline, /gline, /zline, /shun stb. parancsokat idõ paraméter nélkül használod (mint pl. /gline *@valamelyik.csúnya.isp). Az alapérték "állandó" (0). Példa: default-bantime 90d;

    set::modef-default-unsettime <szám>
    Ezzel megadhatod a +f csatornamódhoz használt alapértelmezett törlési idõt (percekben). Ha például 10-et állítasz be, @@ -2227,7 +2270,7 @@ set { A +f csatornamódhoz használt törlési idõ legnagyobb megengedett hossza percekben (itt arról a törlési idõrõl van szó, amit megadunk pl. a +f [5j#i<IDÕ>]:15 paraméterben). Ez egy 0 és 255 közötti érték. Az alapértelmezés 60 (= 1 óra).

    set::ban-version-tkl-time <idõérték>
    - Ha megadod az "action"-t (pl. zline, gline, stb.) a ban version blokkban, itt beállíthatod, + Ha megadod az "action"-t (pl. zline, gline stb.) a ban version blokkban, itt beállíthatod, mennyi idõre legyen az IP kitiltva. Az alapértelmezés 86400 (1 nap).

    set::spamfilter::ban-time <idõérték>
    Ugyanaz, mint a fenti, de a spamszûrõk által beállított *line-okra.

    @@ -2315,7 +2358,7 @@ set {
    M
    - Egy regisztrált nicknév (+r) szükséges a beszélgetéshez + Egy regisztrált nicknév (+r) kell, hogy beszélhess
    h <nick>
    @@ -2404,7 +2447,7 @@ set {
    v <nick>
    - Beszédjogot ad a felhasználónak. (Beszélhet +M csatornákon) + Beszédjogot ad a felhasználónak. (Beszélhet +m csatornákon)
    z
    @@ -2532,7 +2575,7 @@ set {

    7 – Felhasználói és operátori parancsok táblázata

    MEGJEGYZÉS: a /helpop dokumentáció sokkal frissebb, használd /helpop parancs-ot (vagy a /helpop ?parancs-ot, ha operátor vagy), hogy egy parancsról -további információt kapj!

    +további információt kapj.

    @@ -2560,7 +2603,7 @@ tov + mezõ szabadon választható, és korlátozza a visszaadott bejegyzések számát.
    @@ -2719,7 +2762,7 @@ tov + Felhasználói és csatornamódok listáját.
    @@ -2746,12 +2789,12 @@ tov - + - @@ -2809,33 +2852,33 @@ tov + Egy kline eltávolításához használd a /kline -user@host parancsot. + szintaktikai információért. Használd a /zline -*@ip parancsot az eltávolításhoz.
    + szintaktikai információért. Használd a /gline -user@host parancsot az eltávolításhoz.
    - + @@ -2903,7 +2946,7 @@ tov + másodiknak.
    @@ -2979,7 +3022,7 @@ tov + PONTOSAN mit csinál.)
    @@ -2995,13 +3038,13 @@ tov + mit csinál.)
    whowas <nick> <maxválasz> Információt jelenít meg egy nickrõl, amely kilépett a hálózatról. A <max válasz> - mezõ egyéni, és korlátozza a visszaadott bejegyzések számát.
    Mindenki
    mode <csatorna/nick> <mód>
    Csatorna- és felhasználói módok beállítására szolgál. Lásd a - Felhasználói és csatornamódok listáját!
    Mindenki
    identify <jelszó>Elküldi a jelszavad a services rendszerhez a nickneved azonosítására.
    Elküldi a jelszavad a szolgáltatás rendszerhez a nickneved azonosítására.
    Mindenki
    identify <csatorna> <jelszó>Elküldi a jelszavad a services rendszerhez, hogy a csatorna alapítójaként + Elküldi a jelszavad a szolgáltatás rendszerhez, hogy a csatorna alapítójaként azonosítsd magad.
    Mindenki
    Kitiltja a hostmaszkot arról a szerverrõl, ahonnan a parancsot kiadod. A kline nem globális kitiltás.
    Az idõtartam a kitiltás lejárati ideje, és egyike a következõknek: a) egy érték másodpercekben, b) egy idõérték, pl. "1d" (1 nap), vagy c) "0" az állandó kitiltáshoz. Az idõ és az indok nem kötelezõ, ha kihagyod õket, a set::default-bantime (alapértelmezés: 0/állandó) és "no reason" (nincs indok) lesz használatban.
    - Egy kline eltávolításához használd a /kline -user@host parancsot!
    IRCop
    zline [+|-]<*@ip> [<idõtartam> <indok>] Kitilt egy IP címet arról a helyi szerverrõl, ahonnan a parancsot kiadod (nem globális). Lásd a kline-t további - szintaktikai információért! Használd a /zline -*@ip parancsot az eltávolításhoz!
    IRCop
    gline [+|-]<user@host | nick> [<idõtartam> <indok>]
    Globális kitiltást állít be mindazokon a személyeken, akikre a maszk illik. Lásd a kline-t további - szintaktikai információért! Használd a /gline -user@host parancsot az eltávolításhoz!
    IRCop
    shun [+|-]<user@host | nick> [<idõtartam> <indok>]
    Megakadályozza, hogy egy felhasználó BÁRMILYEN parancsot végrehajtson ill. beszéljen. - A shunok globálisak (mint a gline-ok). Lásd a kline-t további szintaktikai információért! - Használd a /shun -user@host parancsot az eltávolításhoz! + A shunok globálisak (mint a gline-ok). Lásd a kline-t további szintaktikai információért. + Használd a /shun -user@host parancsot az eltávolításhoz.
    IRCop
    gzline [+|-]<ip> <idõtartam> :<indok>
    Globális zline-t állít be. Lásd a kline-t további információért! - Használd a /gzline -*@ip parancsot az eltávolításhoz!
    Globális zline-t állít be. Lásd a kline-t további információért. + Használd a /gzline -*@ip parancsot az eltávolításhoz.
    IRCop
    Ha csak egy szervert adsz meg, azt a szervert, amelyiken RAJTA vagy, megpróbálja csatlakoztatni a megadott szerverhez. Ha 2 szerver van megadva, a két szervert kísérli meg csatlakoztatni egymáshoz. A leaf szervert írd be elõször, és a hubot - másodiknak!
    IRCop
    tsctl offset +/- <idõ>
    Beigazítja az IRCD belsõ óráját. (NE használd, ha nem érted, - PONTOSAN mit csinál!)
    IRCop
    tsctl svstime <idõbélyeg>
    Beállítja minden szerver TS idõjét. (NE használd, ha nem érted, PONTOSAN - mit csinál!)
    IRCop
    htm <opció>
    Szabályozza a magas forgalmi móddal kapcsolatos beállításokat. A magas forgalmi mód - (High Traffic Mode, HTM) alapvetõen letilt bizonyos parancsokat, mint a list, whois, who, stb., + (High Traffic Mode, HTM) alapvetõen letilt bizonyos parancsokat, mint a list, whois, who stb., válaszul szerveren kialakult rendkívül magas forgalomra. Az alábbi opciók használhatóak:
    -ON Belép a HTM-be
    -OFF Kilép a HTM-bõl
    @@ -3086,25 +3129,25 @@ a (h

    8.1. Jelszavak

    -Használj jó oper jelszavakat, link jelszavakat, stb.:
    +Használj jó oper jelszavakat, link jelszavakat stb.:
    - használj kis- és nagybetûket, számokat ("Whbviwf5") és/vagy valami hosszú szöveget ("blaheatsafish", "AlphaBeta555").
    -- NE HASZNÁLD a link/oper jelszavaidat semmi másra, legyen az akár az elekronikus postafiókod, botod jelszava, fórumokban, stb...
    +- NE HASZNÁLD a link/oper jelszavaidat semmi másra, legyen az akár az elekronikus postafiókod, botod jelszava, fórumokban stb...

    8.2. Nem ircd-vel kapcsolatos sebezhetõségek

    Sokkal több esély van arra, hogy a gépedet egy irc(d)-n kívüli sebezhetõséggel törik fel, mint hogy egy UnrealIRCd-beli hibával. Például ha http, dns, smtp és ftp szervereket üzemeltetsz ugyanazon a gépen, a veszély sokkal nagyobb. Ezenkívül, ha többfelhasználós rendszered van (pl.: egy shellt vásároltál), megvan a veszély helyi kiskapukra és rossz fájljogosultsági beállításokra (lásd a -következõ pontot). Ennek a veszélye elég magas, ezért vigyázz, amikor shell szolgáltatót választasz! +következõ pontot). Ennek a veszélye elég magas, ezért vigyázz, amikor shell szolgáltatót választasz.

    8.3. Engedélybeállítások és a konfigurációs fájlok

    Mindig gyõzõdj meg arról, hogy a home könyvtáradnak és az UnrealIRCd könyvtárnak megvannak megfelelõ engedélybeállításai; a (csoportnak/)többieknek nem kell, hogy olvasásra engedélyük legyen. Különben egy helyi felhasználó símán megkaparinthatja konfigurációs fájlokat, és jelszavakat kereshet bennük... Röviden: használd a chmod -R go-rwx /ahol/van/az/Unreal3.2 -parancsot, ha nem vagy biztos a dolgodban!
    -További ilyen tanácsok: soha ne rakd az UnrealIRCd-t egy weben látható vagy egyéb módon megoszott könyvtárba! És arról is -gondoskodj, hogy a biztonsági mentéseid is megkapják a megfelelõ engedélybeállításokat! (Elég gyakran megesik, hogy minden +parancsot, ha nem vagy biztos a dolgodban.
    +További ilyen tanácsok: soha ne rakd az UnrealIRCd-t egy weben látható vagy egyéb módon megoszott könyvtárba. És arról is +gondoskodj, hogy a biztonsági mentéseid is megkapják a megfelelõ engedélybeállításokat. (Elég gyakran megesik, hogy minden biztonságos, mégis megbújik valahol egy mindenki számára olvasható mentes.tar.gz.)

    Javasolt még, hogy használj titkosított jelszavakat, ahol lehetséges. @@ -3115,17 +3158,17 @@ inform

    8.4. Felhasználószintû problémák

    Mint a legtöbb dolog, ez sem kimondottan az UnrealIRCd-vel kapcsolatos, de...
    -Mindig figyelmesen válogasd meg az operátoraidat és az adminisztrátoraidat! És emlékezz a leggyengébb láncszem fogalmára is! +Mindig figyelmesen válogasd meg az operátoraidat és az adminisztrátoraidat. És emlékezz a leggyengébb láncszem fogalmára is. Akkor is, ha óvatos voltál, és mindent megcsináltál, ami ebben a leírásban van, lehet, hogy a barátod, aki szintén operátor, elkövet valami hülyeséget. Például megosztja a merevlemezét valamilyen programmal, mint pl. a netbios/kazaa/morpheus/.., trójai -vírust kap, túl egyszerû jelszót használ, stb., stb... Sajnos, ez nem mindig a te irányításod alatt van. +vírust kap, túl egyszerû jelszót használ, stb. stb... Sajnos, ez nem mindig a te irányításod alatt van.

    8.5. SSL/SSH és a szimatolások

    Használj SSL kapcsolatokat a szerverek között valamint operátorként, így megvédheted magad a "szimatolások" ellen. Egy támadó akkor tud szimatolni, ha feltört egy gépet valahol te és az ircd szervered között. Ekkor MINDEN keresztülhaladó hálózati forgalmat -meg tud nézni; például figyelhet minden beszélgetést, jelszavakat lophat (operátori bejelentkezésekhez, nickservhez, stb.)... -Ugyanezen okból mindig használj SSL-t telnet helyett! +meg tud nézni; például figyelhet minden beszélgetést, jelszavakat lophat (operátori bejelentkezésekhez, nickservhez stb.)... +Ugyanezen okból mindig használj SSL-t telnet helyett.

    8.6. Denial of Service támadások (DoS) [avagy: hogyan védd meg a hubodat]

    @@ -3134,7 +3177,7 @@ n de úgy tûnik, néhányan elfelejtik, hogy meglehetõsen könnyû megvédeni a hub szervert a támadásoktól.
    Itt elmagyarázom:
    1. Állítsd a hub nevét egy nemlétezõ gazdanévre, pl. "hub.sajátnet.com"-ra, de
    -    de ne csinálj neki dns rekordot! Ily módon a támadó nem tudja feloldani a gazdanevet, és
    +    de ne csinálj neki dns rekordot. Ily módon a támadó nem tudja feloldani a gazdanevet, és
        nem is tudja floodoltatni. Ezután egyszerûen linkeld a szervereidet a hubra az
        IP cím vagy egyéb más, nem nyilvános gazdanév megadásával.
        1. Példa: link lathatonev.sajatnet.com { hostname 194.15.123.16; [stb] };.
    @@ -3144,13 +3187,13 @@ b 2. Egy másik fontos lépés, hogy elrejtsd a "/stats c" és egyéb statisztikai információkat, máskülönben a támadók egyszerûen
        listát kaphatnak a link blokkokról. Rendszerint, ha paranoiás vagy (mint én), egyszerûen beírhatod,
        hogy: set { oper-only-stats "*"; }; és ezzel letilthatsz minden /stats használatot. Vagy ha nem akarod
    -    ezt, akkor legalább a "CdDlLXz" flageket tiltsd le! Errõl bõvebb információ a következõ pontban.
    +    ezt, akkor legalább a "CdDlLXz" flageket tiltsd le. Errõl bõvebb információ a következõ pontban.

    Természetesen ezek a lépések kevésbé hasznosak, ha túl késõn történnek meg (pl.: egy hónap után), mintsem
    a kezdetektõl fogva, mert lehet, hogy az IP címek már ismertek néhány gonosz fickó számára, de mégis... azért megéri megtenni.
    Az is megjegyzendõ, hogy a támadók még így is lefloodolhatnak minden nem hub szervert, de az több erõfeszítést igényel,
    -mint megtámadni csak 1-2 gyenge pontot (a hubokat), és így a hubjaid valamint a services -életben marad :).
    +mint megtámadni csak 1-2 gyenge pontot (a hubokat), és így a hubjaid valamint a szolgáltatások +életben maradnak :).

    8.7. Információközlés

    @@ -3171,14 +3214,14 @@ Hogy n - /stats E, /stats e: eléggé bizalmas információ, különösen, ha egy támadó használhatja ezeket a címeket
    - /stats i, /stats y: segíthet a támadónak olyan hostot keresni, amely sok kapcsolatot engedélyez.
    - /stats P: segít neki a csak szerverek részére engedélyezett portok keresésében
    -stb., stb...
    +stb. stb...

    MAP / LINKS
    Többen is megkérdezték már, hogy van-e valamilyen módja a /map vagy a /links letiltásának. A mi álláspontunk az, hogy ez ostobaság, és hamis biztonságérzetet ad, hadd magyarázzam el... Elrejteni szervereket, amiket tulajdonképpen a felhasználók használnak, hiábavaló, mivel már régen tudnak a szervereidrõl (hogyan tudnának különben felmenni rájuk, elõször is?). Bármely olyan szerverrel kapcsolatban, amelyeken nem akarsz felhasználókat -látni, lásd a 8.6. szekciót!
    Most mit TEHETSZ? A 3.2.1 óta van egy "flat map" nevû opció (set::options::flat-map), +látni, lásd a 8.6. szekciót.
    Most mit TEHETSZ? A 3.2.1 óta van egy "flat map" nevû opció (set::options::flat-map), ezzel minden szerver úgy jelenik meg a /map-ben és a /links-ben, mintha közvetlenül lennének kapcsolódva, eképpen a közönséges felhasználók többé nem látják, melyik szerver hová lett linkelve... Ez egy hasznos kiegészítõ védelmi réteg lehet, mert a gyerkõcök nem tudják kiszemelni a "gyenge pontokat" @@ -3213,8 +3256,8 @@ a kiad Mint mostmár remélhetõleg érted, soha nem lehetsz 100% biztonságban. Neked és nekünk is rentegeg biztonsági lyukat kell megtalálnunk odakint, miközben egy támadónak elég csak 1 szervert megtalálnia 1 lyukkal. Minden, amit itt elmagyaráztunk, azonban SEGÍT megfontoltan minimálissá tenni a veszélyeket. -Áldozz egy kevés idõt arra, hogy a hálózatodat biztonságossá tedd, és oktasd az operátoraidat! -Nagyon sokan nem is törõdnek a biztonsággal, egészen addíg, amíg bajba nem kerülnek. Próbáld ezt elkerülni! :) +Áldozz egy kevés idõt arra, hogy a hálózatodat biztonságossá tedd, és oktasd az operátoraidat. +Nagyon sokan nem is törõdnek a biztonsággal, egészen addíg, amíg bajba nem kerülnek. Próbáld ezt elkerülni. :)

    diff --git a/extras/defizzer.c b/extras/defizzer.c index 9b1fcc934..fec37d6b5 100644 --- a/extras/defizzer.c +++ b/extras/defizzer.c @@ -35,12 +35,7 @@ DLLFUNC int h_defizzer_connect(aClient *sptr); static Hook *LocConnect = NULL; ModuleInfo DefizzerModInfo; -#ifndef DYNAMIC_LINKING -ModuleHeader defizzer_Header -#else -#define defizzer_Header Mod_Header -ModuleHeader Mod_Header -#endif +ModuleHeader MOD_HEADER(defizzer) = { "defizzer", /* Name of module */ "$Id$", /* Version */ @@ -49,43 +44,25 @@ ModuleHeader Mod_Header NULL }; - -/* The purpose of these ifdefs, are that we can "static" link the ircd if we - * want to -*/ - -/* This is called on module init, before Server Ready */ -#ifdef DYNAMIC_LINKING -DLLFUNC int Mod_Init(ModuleInfo *modinfo) -#else -int defizzer_Init(ModuleInfo *modinfo) -#endif +DLLFUNC int MOD_INIT(defizzer)(ModuleInfo *modinfo) { bcopy(modinfo,&DefizzerModInfo,modinfo->size); LocConnect = HookAddEx(DefizzerModInfo.handle, HOOKTYPE_PRE_LOCAL_CONNECT, h_defizzer_connect); return MOD_SUCCESS; } -/* Is first run when server is 100% ready */ -#ifdef DYNAMIC_LINKING -DLLFUNC int Mod_Load(int module_load) -#else -int defizzer_Load(int module_load) -#endif +DLLFUNC int MOD_LOAD(defizzer)(int module_load) { + return MOD_SUCCESS; } -/* Called when module is unloaded */ -#ifdef DYNAMIC_LINKING -DLLFUNC int Mod_Unload(int module_unload) -#else -int defizzer_Unload(int module_unload) -#endif +DLLFUNC int MOD_UNLOAD(defizzer)(int module_unload) { HookDel(LocConnect); return MOD_SUCCESS; } + static void ban_fizzer(aClient *cptr) { int i; @@ -148,4 +125,4 @@ DLLFUNC int h_defizzer_connect(aClient *sptr) return exit_client(sptr, sptr, &me, "Fizzer client"); } return 0; -} \ No newline at end of file +} diff --git a/extras/tre.tar.gz b/extras/tre.tar.gz index 569ad760b0b879eb3560509bf435de0329483a99..b927a285897aa9b5801d45c87984117d23a071ef 100644 GIT binary patch literal 417393 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

    =(PcoI7{! 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

    GqT>zH3&B8sJ0 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 JMA`tr8~};a_oDy+ diff --git a/help.conf b/help.conf index 4af1fb18e..b11c9291a 100644 --- a/help.conf +++ b/help.conf @@ -37,7 +37,7 @@ help Usercmds { " CYCLE LINKS NOTICE SILENCE WHO"; " DALINFO LIST PART STATS WHOIS"; " INVITE LUSERS PING TIME WHOWAS"; - " ISON MAP PONG TOPIC"; + " ISON MAP PONG TOPIC USERIP"; " JOIN MODE PRIVMSG USERHOST"; " ==-----------------oOo-----------------=="; }; @@ -130,7 +130,9 @@ help Snomasks { " k = View KILL notices"; " n = View nick changes on local server"; " N = View nick changes on remote servers"; + " o = View oper-up notices"; " q = View rejected nick changes due to Q:lines"; + " s = View general notices"; " S = View spamfilter matches"; " v = View usage of /VHOST command"; " ==-------------------------oOo------------------------=="; @@ -164,7 +166,7 @@ help Chmodes { " A = Server/Net Admin only channel (settable by Admins)"; " C = No CTCPs allowed in the channel [o]"; " G = Filters out all Bad words in messages with [o]"; - " M = Must be using a registered nick (+r) to talk [o]"; + " M = Must be using a registered nick (+r), or have voice access to talk [o]"; " K = /KNOCK is not allowed [o]"; " L = Channel link (If +l is full, the next user will auto-join ) [q]"; " N = No Nickname changes are permitted in the channel [o]"; @@ -232,31 +234,60 @@ help Whois { " -"; " Syntax: WHOIS "; " Example: WHOIS hAtbLaDe"; + " -"; + " Status flags:"; + " The list of channels shown in the WHOIS reply can include one or more"; + " status flags to indicate information about the channel. These flags are"; + " described below:"; + " ~ - User is a Channel Owner (+q)"; + " & - User is a Channel Admin (+a)"; + " @ - User is a Channel Operator (+o)"; + " % - User is a Halfop (+h)"; + " + - User is Voiced (+v)"; + " ! - User has channels hidden in whois (+p) and you are an IRC Operator"; + " ? - The channel is secret (+s) and you are an IRC Operator"; }; help Who { " Retrieves information about users"; " -"; " Syntax:"; - " /WHO [+|-][acghmnsuCM] [args]"; + " /WHO [+|-][acghimnsuMRI] [args]"; " Flags are specified like channel modes, the flags cgmnsu all have arguments"; " Flags are set to a positive check by +, a negative check by -"; " The flags available:"; " Flag a: user is away"; " Flag c : user is on , no wildcards accepted"; - " Flag g : user has string in their GCOS,"; + " Flag g : user has string in his/her GCOS,"; " wildcards accepted, oper only"; - " Flag h : user has string in their hostname, wildcards are accepted"; - " Flag m : user has set on them, only o/A/a for nonopers"; - " Flag n : user has string in their nickname, wildcards accepted"; + " Flag h : user has string in his/her hostname, wildcards are accepted"; + " Flag i : user has string in his/her IP address"; + " Flag m : user has set, only o/C/A/a/N for nonopers"; + " Flag n : user has string in his/her nickname, wildcards accepted"; " Flag s : user is on server , wildcards not accepted"; - " Flag u : user has string in their username, wildcards accepted"; + " Flag u : user has string in his/her username, wildcards accepted"; " Behavior flags:"; - " Flag C: show first visible channel user is in"; " Flag M: check for user in channels I am a member of"; + " Flag R: show users' real hostnames"; + " Flag I: show users' IP addresses"; " -"; " For backwards compatibility, /who 0 o still shows +o users"; " Example: WHO +m o"; + " -"; + " Status flags:"; + " The who command shows several flags in the returned result to indicate"; + " different information about the user. These flags are explained below:"; + " G - User is /away (gone)"; + " H - User is not /away (here)"; + " r - User is using a registered nickname"; + " * - User is an IRC Operator"; + " ~ - User is a Channel Owner (+q)"; + " & - User is a Channel Admin (+a)"; + " @ - User is a Channel Operator (+o)"; + " % - User is a Halfop (+h)"; + " + - User is Voiced (+v)"; + " ! - User is +H and you are an IRC Operator"; + " ? - User is only visible because you are an IRC Operator"; }; help Whowas { @@ -427,6 +458,14 @@ help Userhost { " Example: USERHOST hAtbLaDe"; }; +help Userip { + " Returns the userip of the user in question."; + " Usually used by scripts or bots."; + " -"; + " Syntax: USERIP "; + " Example: USERIP codemastr"; +}; + help Topic { " Sets/Changes the topic of the channel in question,"; " or just display the current Topic."; @@ -907,9 +946,10 @@ help Sapart { " Forces a user to part a channel."; " Services Admin Command"; " -"; - " Syntax: SAPART ,[..]"; + " Syntax: SAPART ,[..] []"; " Example: SAPART hAtbLaDe #OperHelp"; " SAPART hAtbLaDe #Support,#IRCHelp"; + " SAPART hAtbLaDe #Support,#IRCHelp Go away"; }; help Samode { @@ -955,13 +995,16 @@ help Sdesc { }; help Mkpasswd { - " This command will Encrypt the string it has been given"; - " So you can add it directly to the unrealircd.conf if you use"; - " Encrypted passwords. Type can be crypt, sha1, or md5. Sha1"; - " and md5 are only available when compiled with SSL support."; + " This command will return a 'hash' of the string that has been specified," + " you can use this hash for any encrypted passwords in your configuration file:"; + " eg: for oper::password, vhost::password, etc."; + " Available types (in order of 'secureness'):"; + " *NIX: crypt, md5, sha1 [*], ripemd160 [*]"; + " Windows: crypt [*], md5, sha1, ripemd160 [*]"; + " [*: only available if compiled with SSL support]"; " -"; " Syntax: MKPASSWD "; - " Example: MKPASSWD crypt mpsare"; + " Example: MKPASSWD md5 IamTeh1337"; }; help Module { @@ -1066,9 +1109,10 @@ help Svspart { " Forces a user to leave a channel."; " Must be sent through an U:Lined server."; " -"; - " Syntax: SVSPART [,..]"; + " Syntax: SVSPART [,..] []"; " Example: SVSPART hAtbLaDe #Hanson"; " SVSPART hAtbLaDe #Hanson,#AOL"; + " SVSPART hAtbLaDe #Hanson,#AOL You must leave"; }; help Svso { @@ -1195,7 +1239,8 @@ help Spamfilter { " Use: /spamfilter [add|del|remove|+|-] [type] [action] [tkltime] [reason] [regex]"; " [type] specifies the target type, you can specify multiple targets:"; " 'c' channel msg, 'p' private msg, 'n' private notice,"; - " 'N' channel notice, 'P' part msg, 'q' quit msg, 'd' dcc"; + " 'N' channel notice, 'P' part msg, 'q' quit msg, 'd' dcc,"; + " 'a' away, 'u' user (nick!user@host:realname ban)"; " [action] specifies the action to be taken (only 1 action can be specified):"; " 'kill', 'tempshun' (only shun current session), 'shun',"; " 'kline', 'gline', 'zline', 'gzline', 'block' (blocks the msg),"; diff --git a/include/auth.h b/include/auth.h index f2434d683..fa1c19bfe 100644 --- a/include/auth.h +++ b/include/auth.h @@ -31,8 +31,9 @@ typedef struct { #define AUTHTYPE_SSL_CLIENTCERT 4 #define AUTHTYPE_RIPEMD160 5 -#ifdef USE_SSL +/* md5 is always available and enabled as of Unreal3.2.1 */ #define AUTHENABLE_MD5 +#ifdef USE_SSL #define AUTHENABLE_SHA1 #define AUTHENABLE_SSL_CLIENTCERT #define AUTHENABLE_RIPEMD160 @@ -47,11 +48,7 @@ typedef struct { #endif #endif - #ifdef _WIN32 -#ifndef AUTHENABLE_MD5 -#define AUTHENABLE_MD5 -#endif #ifndef AUTHENABLE_SHA1 #define AUTHENABLE_SHA1 #endif diff --git a/include/common.h b/include/common.h index 9deaca0c7..7131c34ba 100644 --- a/include/common.h +++ b/include/common.h @@ -150,8 +150,9 @@ extern char *strtoken(char **, char *, char *); extern MODVAR u_char tolowertab[], touppertab[]; -#if defined(CHINESE_NICK) || defined(JAPANESE_NICK) +#if defined(NICK_GB2312) || defined(NICK_GBK) || defined(NICK_GBK_JAP) #define USE_LOCALE +#include #endif #ifndef USE_LOCALE @@ -248,67 +249,18 @@ extern struct SLink *find_user_link( /* struct SLink *, struct Client * */ ); #define EXPAR4 "" #endif /* EXTCMODE */ -#define PROTOCTL_CLIENT_1 \ - "MAP" \ - " KNOCK" \ - " SAFELIST" \ - " HCN" \ - " MAXCHANNELS=%i" \ - " MAXBANS=%i" \ - " NICKLEN=%i" \ - " TOPICLEN=%i" \ - " KICKLEN=%i" \ - " MAXTARGETS=%i" \ - " AWAYLEN=%i" \ - " :are supported by this server" -#define PROTOCTL_PARAMETERS_1 \ - MAXCHANNELSPERUSER, \ - MAXBANS, \ - NICKLEN, \ - TOPICLEN, \ - TOPICLEN, \ - MAXTARGETS, \ - TOPICLEN - #ifdef PREFIX_AQ -#define CHPFIX "(qaohv)~&@%+" -#define CHPAR1 "be" +#define CHPFIX "(qaohv)~&@%+" +#define CHPAR1 "be" #else -#define CHPFIX "(ohv)@%+" -#define CHPAR1 "beqa" +#define CHPFIX "(ohv)@%+" +#define CHPAR1 "beqa" #endif /* PREFIX_AQ */ -#define CHPAR2 "kfL" -#define CHPAR3 "l" -#define CHPAR4 "psmntirRcOAQKVGCuzNSM" +#define CHPAR2 "kfL" +#define CHPAR3 "l" +#define CHPAR4 "psmntirRcOAQKVGCuzNSM" -#define PROTOCTL_CLIENT_2 \ - "WALLCHOPS" \ - " WATCH=%i" \ - " SILENCE=%i" \ - " MODES=%i" \ - " CHANTYPES=%s" \ - " PREFIX=%s" \ - " CHANMODES=%s%s,%s%s,%s%s,%s%s" \ - " NETWORK=%s" \ - " CASEMAPPING=%s" \ - " EXTBAN=~,%s" \ - " ELIST=MNUCT" \ - " :are supported by this server" - -#define PROTOCTL_PARAMETERS_2 \ - MAXWATCH, \ - SILENCE_LIMIT, \ - MAXMODEPARAMS, \ - "#", \ - CHPFIX, \ - CHPAR1, EXPAR1, \ - CHPAR2, EXPAR2, \ - CHPAR3, EXPAR3, \ - "psmntirRcOAQKVGCuzNSM", EXPAR4, \ - ircnet005, \ - "ascii", \ - extbanstr /* Server-Server PROTOCTL -Stskeeps * Please check send_proto() for more. -- Syzop diff --git a/include/config.h b/include/config.h index a7eba3a33..2b82771c0 100644 --- a/include/config.h +++ b/include/config.h @@ -92,14 +92,6 @@ */ #undef SECURECHANMSGSONLYGOTOSECURE -/* - * be compatible with older cloak keys? If you link to servers beta4 and - * earlier without this the cloak keys will produce diff results - * Not recommended, however, as beta4 and earlier 3.2 has an insecure - * cloak algo -griever - */ -#undef COMPAT_BETA4_KEYS - /* If you want SHUN_NOTICES, define this */ @@ -108,8 +100,9 @@ /* If you want to support chinese and/or japanese nicks */ -#undef CHINESE_NICK -#undef JAPANESE_NICK +#undef NICK_GB2312 +#undef NICK_GBK +#undef NICK_GBK_JAP /* Remote rehash @@ -377,25 +370,13 @@ #define PORTNUM 6667 /* 6667 is default */ /* - * Maximum number of network connections your server will allow. This should - * never exceed max. number of open file descrpitors and wont increase this. - * Should remain LOW as possible. Most sites will usually have under 30 or so - * connections. A busy hub or server may need this to be as high as 50 or 60. - * Making it over 100 decreases any performance boost gained from it being low. - * if you have a lot of server connections, it may be worth splitting the load - * over 2 or more servers. - * 1 server = 1 connection, 1 user = 1 connection. - * This should be at *least* 3: 1 listen port, 1 dns port + 1 client - * - * Note: this figure will be too high for most systems. If you get an - * fd-related error on compile, change this to 256. - * - * Windows users: This should be a fairly high number. Some operations - * will slow down because of this, but it is _required_ because of the way - * windows NT(and possibly 95) allocate fd handles. A good number is 16384. + * Maximum number of network connections your server will allow. + * This is usually configured via ./Config on *NIX, + * the setting mentioned below is the default for Windows. + * 2004-10-13: 1024 -> 4096 */ #ifndef MAXCONNECTIONS -#define MAXCONNECTIONS 1024 +#define MAXCONNECTIONS 4096 #endif /* diff --git a/include/h.h b/include/h.h index c5624d4c8..e6c9d2822 100644 --- a/include/h.h +++ b/include/h.h @@ -457,6 +457,7 @@ extern MODVAR long SNO_FNICKCHANGE; extern MODVAR long SNO_QLINE; extern MODVAR long SNO_SNOTICE; extern MODVAR long SNO_SPAMF; +extern MODVAR long SNO_OPER; #ifdef EXTCMODE /* Extended chanmodes... */ @@ -703,3 +704,7 @@ extern int add_dccallow(aClient *sptr, aClient *optr); extern int del_dccallow(aClient *sptr, aClient *optr); extern void delete_linkblock(ConfigItem_link *link_ptr); extern void delete_classblock(ConfigItem_class *class_ptr); +extern void del_async_connects(void); +extern int find_spamfilter_user(aClient *sptr); +extern void make_extbanstr(void); +extern void isupport_init(void); diff --git a/include/macros.h b/include/macros.h new file mode 100644 index 000000000..20a1b6c3d --- /dev/null +++ b/include/macros.h @@ -0,0 +1,23 @@ +/************************************************************************ + * Unreal Internet Relay Chat Daemon, include/macros.h + * Copyright (c) 2004 Dominick Meglio & The UnrealIRCd Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id$ + */ + +/* Calculate the size of an array */ +#define ARRAY_SIZEOF(x) (sizeof((x))/sizeof((x)[0])) diff --git a/include/modules.h b/include/modules.h index 8feb615e5..95771a893 100644 --- a/include/modules.h +++ b/include/modules.h @@ -99,6 +99,7 @@ typedef struct { #define MOBJ_CMDOVERRIDE 0x0080 #define MOBJ_EXTBAN 0x0100 #define MOBJ_CALLBACK 0x0200 +#define MOBJ_ISUPPORT 0x0400 typedef struct { long mode; @@ -294,6 +295,13 @@ typedef struct _versionflag { ModuleChild *parents; } Versionflag; +typedef struct _isupport { + struct _isupport *prev, *next; + char *token; + char *value; + Module *owner; +} Isupport; + typedef struct _ModuleObject { struct _ModuleObject *prev, *next; short type; @@ -308,6 +316,7 @@ typedef struct _ModuleObject { Cmdoverride *cmdoverride; Extban *extban; Callback *callback; + Isupport *isupport; } object; } ModuleObject; @@ -461,6 +470,11 @@ void *obsd_dlsym(void *handle, char *symbol); Versionflag *VersionflagAdd(Module *module, char flag); void VersionflagDel(Versionflag *vflag, Module *module); +Isupport *IsupportAdd(Module *module, const char *token, const char *value); +void IsupportSetValue(Isupport *isupport, const char *value); +void IsupportDel(Isupport *isupport); +Isupport *IsupportFind(const char *token); + #define add_Hook(hooktype, func) HookAddMain(NULL, hooktype, func, NULL, NULL) #define HookAdd(hooktype, func) HookAddMain(NULL, hooktype, func, NULL, NULL) #define HookAddEx(module, hooktype, func) HookAddMain(module, hooktype, func, NULL, NULL) @@ -569,6 +583,9 @@ int CallCmdoverride(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, ch #define HOOKTYPE_TKL_DEL 40 #define HOOKTYPE_LOCAL_KILL 41 #define HOOKTYPE_LOG 42 +#define HOOKTYPE_REMOTE_JOIN 43 +#define HOOKTYPE_REMOTE_PART 44 +#define HOOKTYPE_REMOTE_KICK 45 /* Hook return values */ #define HOOK_CONTINUE 0 diff --git a/include/msg.h b/include/msg.h index 90ada1180..225c089e2 100644 --- a/include/msg.h +++ b/include/msg.h @@ -239,7 +239,6 @@ #define MSG_TSCTL "TSCTL" #define TOK_TSCTL "AW" #define MSG_SVSJOIN "SVSJOIN" -#define TOK_SVSJOIN "BR" #define MSG_SAJOIN "SAJOIN" #define TOK_SAJOIN "AX" #define MSG_SVSPART "SVSPART" diff --git a/include/numeric.h b/include/numeric.h index 7aec7d7e4..3f66693cb 100644 --- a/include/numeric.h +++ b/include/numeric.h @@ -33,11 +33,11 @@ #define RPL_YOURHOST 002 #define RPL_CREATED 003 #define RPL_MYINFO 004 -#define RPL_PROTOCTL 005 +#define RPL_ISUPPORT 005 #define RPL_REDIR 10 -#define RPL_REMOTEPROTOCTL 105 +#define RPL_REMOTEISUPPORT 105 /* * Errors are in the range from 400-599 currently and are grouped by what @@ -184,6 +184,7 @@ #define RPL_LISTSYNTAX 334 #define RPL_WHOISBOT 335 +#define RPL_USERIP 340 #define RPL_INVITING 341 #define RPL_SUMMONING 342 diff --git a/include/struct.h b/include/struct.h index 271297001..71c8b7d26 100644 --- a/include/struct.h +++ b/include/struct.h @@ -263,6 +263,8 @@ typedef unsigned int u_int32_t; /* XXX Hope this works! */ #define SetClient(x) ((x)->status = STAT_CLIENT) #define SetLog(x) ((x)->status = STAT_LOG) +#define IsSynched(x) (x->serv->flags.synced) + /* opt.. */ #define OPT_SJOIN 0x0001 #define OPT_NOT_SJOIN 0x0002 @@ -327,7 +329,7 @@ typedef unsigned int u_int32_t; /* XXX Hope this works! */ * -DuffJ */ -#define SNO_DEFOPER "+kscfvGq" +#define SNO_DEFOPER "+kscfvGqo" #define SNO_DEFUSER "+ks" #define SEND_UMODES (SendUmodes) @@ -684,7 +686,9 @@ struct MotdItem { struct aloopStruct { unsigned do_garbage_collect : 1; unsigned ircd_booted : 1; - unsigned do_bancheck : 1; + unsigned do_bancheck : 1; /* perform *line bancheck? */ + unsigned do_bancheck_spamf_user : 1; /* perform 'user' spamfilter bancheck */ + unsigned do_bancheck_spamf_away : 1; /* perform 'away' spamfilter bancheck */ unsigned ircd_rehashing : 1; unsigned tainted : 1; aClient *rehash_save_cptr, *rehash_save_sptr; @@ -768,6 +772,7 @@ struct Server { #define M_ALIAS 0x0020 #define M_RESETIDLE 0x0040 #define M_VIRUS 0x0080 +#define M_ANNOUNCE 0x0100 /* tkl: @@ -791,6 +796,8 @@ struct Server { #define SPAMF_PART 0x0010 /* P */ #define SPAMF_QUIT 0x0020 /* q */ #define SPAMF_DCC 0x0040 /* d */ +#define SPAMF_USER 0x0080 /* u */ +#define SPAMF_AWAY 0x0100 /* a */ struct _spamfilter { unsigned short action; /* see BAN_ACT* */ @@ -921,11 +928,13 @@ struct Client { long receiveM; /* Statistics: protocol messages received */ #ifdef ZIP_LINKS struct Zdata *zip; /* zip data */ +#elif defined(_WIN32) + void *zip_NOTUSED; /* (win32 binary compatability) */ #endif #ifdef USE_SSL SSL *ssl; #elif defined(_WIN32) - void *ssl_NOTUSED; + void *ssl_NOTUSED; /* (win32 binary compatability) */ #endif #ifndef NO_FDLIST long lastrecvM; /* to check for activity --Mika */ @@ -1091,6 +1100,7 @@ struct _configitem_oper { anAuthStruct *auth; ConfigItem_class *class; ConfigItem *from; + unsigned long modes; long oflags; int maxlogins; }; @@ -1260,24 +1270,24 @@ struct _configitem_unknown_ext { ConfigEntry *ce_entries; }; -#define ALIAS_SERVICES 1 -#define ALIAS_STATS 2 -#define ALIAS_NORMAL 3 -#define ALIAS_COMMAND 4 + +typedef enum { + ALIAS_SERVICES=1, ALIAS_STATS, ALIAS_NORMAL, ALIAS_COMMAND, ALIAS_CHANNEL +} AliasType; struct _configitem_alias { ConfigItem *prev, *next; ConfigFlag flag; ConfigItem_alias_format *format; char *alias, *nick; - short type; + AliasType type; }; struct _configitem_alias_format { ConfigItem *prev, *next; ConfigFlag flag; char *nick; - short type; + AliasType type; char *format, *parameters; regex_t expr; }; diff --git a/include/version.h b/include/version.h index c3d4d4509..3a2a7f18d 100644 --- a/include/version.h +++ b/include/version.h @@ -24,12 +24,12 @@ /**/ #define COMPILEINFO DEBUGMODESET DEBUGSET /* - * Version Unreal3.2.1 + * Version Unreal3.2.2 */ -#define UnrealProtocol 2304 +#define UnrealProtocol 2305 #define PATCH1 "3" #define PATCH2 ".2" -#define PATCH3 ".1" +#define PATCH3 ".2" #define PATCH4 "" #define PATCH5 "" #define PATCH6 "" diff --git a/include/win32/regex.h b/include/win32/regex.h index ae709c9e2..394115313 100644 --- a/include/win32/regex.h +++ b/include/win32/regex.h @@ -51,6 +51,14 @@ extern "C" { typedef int reg_errcode_t; #endif /* !HAVE_REG_ERRCODE_T */ +/* Extra regcomp() flags. */ +#define REG_LITERAL 0x1000 +#define REG_RIGHT_ASSOC (REG_LITERAL << 1) + +/* Extra regexec() flags. */ +#define REG_APPROX_MATCHER 0x1000 +#define REG_BACKTRACKING_MATCHER (REG_APPROX_MATCHER << 1) + #else /* !TRE_USE_SYSTEM_REGEX_H */ /* If the we're not using system regex.h, we need to define the @@ -59,7 +67,7 @@ typedef int reg_errcode_t; typedef int regoff_t; typedef struct { size_t re_nsub; /* Number of parenthesized subexpressions. */ - void *value; /* For internal use only. */ + void *value; /* For internal use only. */ } regex_t; typedef struct { @@ -69,45 +77,50 @@ typedef struct { typedef enum { - REG_OK = 0, /* No error. */ + REG_OK = 0, /* No error. */ /* POSIX regcomp() return error codes. (In the order listed in the - standard.) */ - REG_NOMATCH, /* No match. */ - REG_BADPAT, /* Invalid regexp. */ - REG_ECOLLATE, /* Unknown collating element. */ - REG_ECTYPE, /* Unknown character class name. */ - REG_EESCAPE, /* Trailing backslash. */ - REG_ESUBREG, /* Invalid back reference. */ - REG_EBRACK, /* "[]" imbalance */ - REG_EPAREN, /* "\(\)" or "()" imbalance */ - REG_EBRACE, /* "\{\}" or "{}" imbalance */ - REG_BADBR, /* Invalid content of {} */ - REG_ERANGE, /* Invalid use of range operator */ - REG_ESPACE, /* Out of memory. */ + standard.) */ + REG_NOMATCH, /* No match. */ + REG_BADPAT, /* Invalid regexp. */ + REG_ECOLLATE, /* Unknown collating element. */ + REG_ECTYPE, /* Unknown character class name. */ + REG_EESCAPE, /* Trailing backslash. */ + REG_ESUBREG, /* Invalid back reference. */ + REG_EBRACK, /* "[]" imbalance */ + REG_EPAREN, /* "\(\)" or "()" imbalance */ + REG_EBRACE, /* "\{\}" or "{}" imbalance */ + REG_BADBR, /* Invalid content of {} */ + REG_ERANGE, /* Invalid use of range operator */ + REG_ESPACE, /* Out of memory. */ REG_BADRPT } reg_errcode_t; /* POSIX regcomp() flags. */ -#define REG_EXTENDED 1 -#define REG_ICASE (REG_EXTENDED << 1) -#define REG_NEWLINE (REG_ICASE << 1) -#define REG_NOSUB (REG_NEWLINE << 1) +#define REG_EXTENDED 1 +#define REG_ICASE (REG_EXTENDED << 1) +#define REG_NEWLINE (REG_ICASE << 1) +#define REG_NOSUB (REG_NEWLINE << 1) /* Extra regcomp() flags. */ -#define REG_BASIC 0 -#define REG_LITERAL (REG_NOSUB << 1) +#define REG_BASIC 0 +#define REG_LITERAL (REG_NOSUB << 1) +#define REG_RIGHT_ASSOC (REG_LITERAL << 1) /* POSIX regexec() flags. */ #define REG_NOTBOL 1 #define REG_NOTEOL (REG_NOTBOL << 1) +/* Extra regexec() flags. */ +#define REG_APPROX_MATCHER (REG_NOTEOL << 1) +#define REG_BACKTRACKING_MATCHER (REG_APPROX_MATCHER << 1) + #endif /* !TRE_USE_SYSTEM_REGEX_H */ /* REG_NOSPEC and REG_LITERAL mean the same thing. */ #if defined(REG_LITERAL) -#define REG_NOSPEC REG_LITERAL +#define REG_NOSPEC REG_LITERAL #elif defined(REG_NOSPEC) -#define REG_LITERAL REG_NOSPEC +#define REG_LITERAL REG_NOSPEC #endif /* defined(REG_NOSPEC) */ /* The maximum number of iterations in a bound expression. */ @@ -148,24 +161,24 @@ int regwnexec(const regex_t *preg, const wchar_t *string, size_t len, /* Approximate matching parameter struct. */ typedef struct { - int cost_ins; /* Default cost of an inserted character. */ - int cost_del; /* Default cost of a deleted character. */ + int cost_ins; /* Default cost of an inserted character. */ + int cost_del; /* Default cost of a deleted character. */ int cost_subst; /* Default cost of a substituted character. */ - int max_cost; /* Maximum allowed cost of a match. */ + int max_cost; /* Maximum allowed cost of a match. */ - int max_ins; /* Maximum allowed number of inserts. */ - int max_del; /* Maximum allowed number of deletes. */ + int max_ins; /* Maximum allowed number of inserts. */ + int max_del; /* Maximum allowed number of deletes. */ int max_subst; /* Maximum allowed number of substitutes. */ - int max_err; /* Maximum allowed number of errors total. */ + int max_err; /* Maximum allowed number of errors total. */ } regaparams_t; /* Approximate matching result struct. */ typedef struct { size_t nmatch; /* Length of pmatch[] array. */ regmatch_t *pmatch; /* Submatch data. */ - int cost; /* Cost of the match. */ - int num_ins; /* Number of inserts in the match. */ - int num_del; /* Number of deletes in the match. */ + int cost; /* Cost of the match. */ + int num_ins; /* Number of inserts in the match. */ + int num_del; /* Number of deletes in the match. */ int num_subst; /* Number of substitutes in the match. */ } regamatch_t; @@ -187,9 +200,28 @@ int regawnexec(const regex_t *preg, const wchar_t *string, size_t len, void regaparams_default(regaparams_t *params); #endif /* TRE_APPROX */ -/* Returns the version string. The returned string is static. */ +#ifdef TRE_WCHAR +typedef wchar_t tre_char_t; +#else /* !TRE_WCHAR */ +typedef unsigned char tre_char_t; +#endif /* !TRE_WCHAR */ + +typedef struct { + int (*get_next_char)(tre_char_t *c, unsigned int *pos_add, void *context); + void (*rewind)(size_t pos, void *context); + int (*compare)(size_t pos1, size_t pos2, size_t len, void *context); + void *context; +} tre_str_source; + +int reguexec(const regex_t *preg, const tre_str_source *string, + size_t nmatch, regmatch_t pmatch[], int eflags); + +/* Returns the version string. The returned string is static. */ char *tre_version(void); +/* Returns the value for a config parameter. The type to which `result' + must point to depends of the value of `query', see documentation for + more details. */ int tre_config(int query, void *result); enum { @@ -200,6 +232,13 @@ enum { TRE_CONFIG_VERSION }; +/* Returns 1 if the compiled pattern has back references, 0 if not. */ +int tre_have_backrefs(const regex_t *preg); + +/* Returns 1 if the compiled pattern uses approximate matching features, + 0 if not. */ +int tre_have_approx(const regex_t *preg); + #ifdef __cplusplus } #endif diff --git a/include/win32/tre-config.h b/include/win32/tre-config.h index ab08344e1..0f9f42903 100644 --- a/include/win32/tre-config.h +++ b/include/win32/tre-config.h @@ -1,6 +1,16 @@ /* tre-config.h. This file defines all compile time definitions that are needed in `regex.h' for Win32. */ +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBUTF8_H */ + /* Define to 1 if the system has the type `reg_errcode_t'. */ /* #undef HAVE_REG_ERRCODE_T */ @@ -16,11 +26,27 @@ /* Define to enable multibyte character set support. */ #undef TRE_MULTIBYTE -/* Define to include the system regex.h from TRE regex.h */ -/* #undef TRE_USE_SYSTEM_REGEX_H */ - /* Define to the absolute path to the system regex.h */ /* #undef TRE_SYSTEM_REGEX_H_PATH */ +/* Define if you want TRE to use alloca() instead of malloc() when allocating + memory needed for regexec operations. */ +#define TRE_USE_ALLOCA 1 + +/* Define to include the system regex.h from TRE regex.h */ +/* #undef TRE_USE_SYSTEM_REGEX_H */ + /* Define to enable wide character (wchar_t) support. */ #undef TRE_WCHAR + +/* TRE version string. */ +#define TRE_VERSION "0.7.0" + +/* TRE version level 1. */ +#define TRE_VERSION_1 0 + +/* TRE version level 2. */ +#define TRE_VERSION_2 7 + +/* TRE version level 3. */ +#define TRE_VERSION_3 0 diff --git a/makefile.win32 b/makefile.win32 index d5d3db274..b9e91a052 100644 --- a/makefile.win32 +++ b/makefile.win32 @@ -101,9 +101,9 @@ OPENSSL_LIB=/LIBPATH:"$(OPENSSL_LIB_DIR)" !ENDIF !IFDEF DEBUG -DBGCFLAG=/MDd /Zi +DBGCFLAG=/MD /Zi DBGLFLAG=/debug /debugtype:BOTH -MODDBGCFLAG=/LDd /MDd /Zi +MODDBGCFLAG=/LDd /MD /Zi !ELSE DBGCFLAG=/MD /O2 /G5 MODDBGCFLAG=/LD /MD @@ -138,10 +138,11 @@ EXP_OBJ_FILES=SRC/CHANNEL.OBJ SRC/SEND.OBJ SRC/SOCKET.OBJ \ SRC/S_KLINE.OBJ SRC/S_EXTRA.OBJ SRC/IRCSPRINTF.OBJ SRC/LUSERS.OBJ \ SRC/SCACHE.OBJ SRC/ALN.OBJ SRC/BADWORDS.OBJ SRC/WEBTV.OBJ SRC/RES.OBJ SRC/MODULES.OBJ \ SRC/S_SVS.OBJ SRC/EVENTS.OBJ SRC/UMODES.OBJ SRC/AUTH.OBJ SRC/CIDR.OBJ SRC/SSL.OBJ \ - SRC/RANDOM.OBJ SRC/EXTCMODES.OBJ SRC/MD5.OBJ \ + SRC/RANDOM.OBJ SRC/EXTCMODES.OBJ SRC/MD5.OBJ SRC/API-ISUPPORT.OBJ SRC/API-COMMAND.OBJ \ SRC/EXTBANS.OBJ $(ZIPOBJ) $(CURLOBJ) -OBJ_FILES=$(EXP_OBJ_FILES) SRC/WIN32GUI.OBJ SRC/SERVICE.OBJ SRC/DEBUG.OBJ +OBJ_FILES=$(EXP_OBJ_FILES) SRC/GUI.OBJ SRC/SERVICE.OBJ SRC/DEBUG.OBJ SRC/RTF.OBJ \ + SRC/EDITOR.OBJ SRC/WIN32.OBJ MOD_FILES=SRC/MODULES/L_COMMANDS.C SRC/MODULES/M_CHGHOST.C SRC/MODULES/M_SDESC.C \ SRC/MODULES/M_SETIDENT.C SRC/MODULES/M_SETNAME.C SRC/MODULES/M_SETHOST.C \ @@ -170,7 +171,7 @@ MOD_FILES=SRC/MODULES/L_COMMANDS.C SRC/MODULES/M_CHGHOST.C SRC/MODULES/M_SDESC.C SRC/MODULES/M_RULES.C SRC/MODULES/M_CLOSE.C SRC/MODULES/M_MAP.C SRC/MODULES/M_EOS.C \ SRC/MODULES/M_SERVER.C SRC/MODULES/M_STATS.C SRC/MODULES/M_SVSFLINE.C \ SRC/MODULES/M_DCCDENY.C SRC/MODULES/M_UNDCCDENY.C SRC/MODULES/M_WHOWAS.C \ - SRC/MODULES/M_CONNECT.C SRC/MODULES/M_DCCALLOW.C + SRC/MODULES/M_CONNECT.C SRC/MODULES/M_DCCALLOW.C SRC/MODULES/M_USERIP.C DLL_FILES=SRC/MODULES/M_CHGHOST.DLL SRC/MODULES/M_SDESC.DLL SRC/MODULES/M_SETIDENT.DLL \ SRC/MODULES/M_SETNAME.DLL SRC/MODULES/M_SETHOST.DLL SRC/MODULES/M_CHGIDENT.DLL \ @@ -201,7 +202,7 @@ DLL_FILES=SRC/MODULES/M_CHGHOST.DLL SRC/MODULES/M_SDESC.DLL SRC/MODULES/M_SETIDE SRC/MODULES/M_CLOSE.DLL SRC/MODULES/M_MAP.DLL SRC/MODULES/M_EOS.DLL \ SRC/MODULES/M_SERVER.DLL SRC/MODULES/M_STATS.DLL SRC/MODULES/M_SVSFLINE.DLL \ SRC/MODULES/M_DCCDENY.DLL SRC/MODULES/M_UNDCCDENY.DLL SRC/MODULES/M_WHOWAS.DLL \ - SRC/MODULES/M_CONNECT.DLL SRC/MODULES/M_DCCALLOW.DLL \ + SRC/MODULES/M_CONNECT.DLL SRC/MODULES/M_DCCALLOW.DLL SRC/MODULES/M_USERIP.DLL \ SRC/MODULES/CLOAK.DLL SRC/MODULES/OLDCLOAK.DLL @@ -362,18 +363,27 @@ src/hash.obj: src/hash.c $(INCLUDES) ./include/hash.h src/crule.obj: src/crule.c $(INCLUDES) $(CC) $(CFLAGS) src/crule.c -src/win32gui.obj: src/win32/win32gui.c $(INCLUDES) ./include/resource.h - $(CC) $(CFLAGS) src/win32/win32gui.c +src/gui.obj: src/win32/gui.c $(INCLUDES) ./include/resource.h + $(CC) $(CFLAGS) src/win32/gui.c + +src/rtf.obj: src/win32/rtf.c $(INCLUDES) ./src/win32/win32.h + $(CC) $(CFLAGS) src/win32/rtf.c + +src/editor.obj: src/win32/editor.c $(INCLUDES) ./include/resource.h ./src/win32/win32.h + $(CC) $(CFLAGS) src/win32/editor.c src/service.obj: src/win32/service.c $(INCLUDES) $(CC) $(CFLAGS) src/win32/service.c -src/unreal.obj: src/win32/unreal.c $(INCLUDES) - $(CC) $(CFLAGS) src/win32/unreal.c - src/debug.obj: src/win32/debug.c $(INCLUDES) $(CC) $(CFLAGS) src/win32/debug.c +src/win32.obj: src/win32/win32.c $(INCLUDES) + $(CC) $(CFLAGS) src/win32/win32.c + +src/unreal.obj: src/win32/unreal.c $(INCLUDES) + $(CC) $(CFLAGS) src/win32/unreal.c + src/res_comp.obj: src/res_comp.c $(INCLUDES) $(CC) $(CFLAGS) src/res_comp.c @@ -413,6 +423,12 @@ src/url.obj: src/url.c $(INCLUDES) ./include/url.h src/extbans.obj: src/extbans.c $(INCLUDES) $(CC) $(CFLAGS) src/extbans.c +src/api-isupport.obj: src/api-isupport.c $(INCLUDES) + $(CC) $(CFLAGS) src/api-isupport.c + +src/api-command.obj: src/api-command.c $(INCLUDES) + $(CC) $(CFLAGS) src/api-command.c + src/zip.obj: src/zip.c $(INCLUDES) $(CC) $(CFLAGS) src/zip.c @@ -713,6 +729,9 @@ src/modules/m_connect.dll: src/modules/m_connect.c $(INCLUDES) src/modules/m_dccallow.dll: src/modules/m_dccallow.c $(INCLUDES) $(CC) $(MODCFLAGS) src/modules/m_dccallow.c $(MODLFLAGS) +src/modules/m_userip.dll: src/modules/m_userip.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/m_userip.c $(MODLFLAGS) + src/modules/cloak.dll: src/modules/cloak.c $(INCLUDES) $(CC) $(MODCFLAGS) src/modules/cloak.c $(MODLFLAGS) diff --git a/src/Makefile b/src/Makefile index 97404e1c2..10507687f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -29,7 +29,7 @@ OBJS=auth.o aln.o badwords.o channel.o cloak.o crule.o dbuf.o \ s_misc.o s_numeric.o s_serv.o s_svs.o $(STRTOUL) socket.o \ ssl.o s_user.o scache.o send.o support.o umodes.o \ version.o webtv.o whowas.o zip.o cidr.o random.o extcmodes.o \ - extbans.o md5.o $(URL) + extbans.o md5.o api-isupport.o api-command.o $(URL) SRC=$(OBJS:%.o=%.c) @@ -250,6 +250,12 @@ extbans.o: extbans.c $(INCLUDES) md5.o: md5.c $(INCLUDES) $(CC) $(CFLAGS) -c md5.c +api-command.o: api-command.c $(INCLUDES) + $(CC) $(CFLAGS) -c api-command.c + +api-isupport.o: api-isupport.c $(INCLUDES) + $(CC) $(CFLAGS) -c api-isupport.c + url.o: url.c $(INCLUDES) ../include/url.h $(CC) $(CFLAGS) -c url.c diff --git a/src/api-command.c b/src/api-command.c new file mode 100644 index 000000000..acc1c7f76 --- /dev/null +++ b/src/api-command.c @@ -0,0 +1,149 @@ +/************************************************************************ + * Unreal Internet Relay Chat Daemon, src/api-command.c + * Copyright (C) 2004 Dominick Meglio and The UnrealIRCd Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "msg.h" +#include "h.h" +#include + +char *cmdstr = NULL; + +int CommandExists(char *name) +{ + aCommand *p; + + for (p = CommandHash[toupper(*name)]; p; p = p->next) + { + if (!stricmp(p->cmd, name)) + return 1; + } + for (p = TokenHash[*name]; p; p = p->next) + { + if (!strcmp(p->cmd, name)) + return 1; + } + return 0; +} + +Command *CommandAdd(Module *module, char *cmd, char *tok, int (*func)(), unsigned char params, int flags) { + Command *command; + + if (find_Command_simple(cmd) || (tok && find_Command_simple(tok))) + { + if (module) + module->errorcode = MODERR_EXISTS; + return NULL; + } + command = MyMallocEx(sizeof(Command)); + command->cmd = add_Command_backend(cmd,func,params, 0, flags); + command->tok = NULL; + command->cmd->owner = module; + if (tok) { + command->tok = add_Command_backend(tok,func,params,1,flags); + command->cmd->friend = command->tok; + command->tok->friend = command->cmd; + command->tok->owner = module; + } + else + command->cmd->friend = NULL; + if (module) { + ModuleObject *cmdobj = (ModuleObject *)MyMallocEx(sizeof(ModuleObject)); + cmdobj->object.command = command; + cmdobj->type = MOBJ_COMMAND; + AddListItem(cmdobj, module->objects); + module->errorcode = MODERR_NOERROR; + } + if (flags & M_ANNOUNCE) + { + char *tmp; + if (cmdstr) + tmp = MyMallocEx(strlen(cmdstr)+strlen(cmd)+2); + else + tmp = MyMallocEx(strlen(cmd)+2); + if (cmdstr) + { + strcpy(tmp, cmdstr); + strcat(tmp, ","); + } + strcat(tmp, cmd); + if (cmdstr) + { + IsupportSetValue(IsupportFind("CMDS"), tmp); + free(cmdstr); + } + else + IsupportAdd(NULL, "CMDS", tmp); + cmdstr = tmp; + } + return command; +} + + +void CommandDel(Command *command) { + Cmdoverride *ovr, *ovrnext; + + if (command->cmd->flags & M_ANNOUNCE) + { + char *tmp = MyMallocEx(strlen(cmdstr)+1); + char *tok; + for (tok = strtok(cmdstr, ","); tok; tok = strtok(NULL, ",")) + { + if (!stricmp(tok, command->cmd->cmd)) + continue; + if (tmp) + strcat(tmp, ","); + strcat(tmp, tok); + } + free(cmdstr); + if (!*tmp) + { + IsupportDel(IsupportFind("CMDS")); + cmdstr = NULL; + } + else + cmdstr = tmp; + } + DelListItem(command->cmd, CommandHash[toupper(*command->cmd->cmd)]); + if (command->tok) + DelListItem(command->tok, TokenHash[*command->tok->cmd]); + if (command->cmd->owner) { + ModuleObject *cmdobj; + for (cmdobj = command->cmd->owner->objects; cmdobj; cmdobj = (ModuleObject *)cmdobj->next) { + if (cmdobj->type == MOBJ_COMMAND && cmdobj->object.command == command) { + DelListItem(cmdobj,command->cmd->owner->objects); + MyFree(cmdobj); + break; + } + } + } + for (ovr = command->cmd->overriders; ovr; ovr = ovrnext) + { + ovrnext = ovr->next; + CmdoverrideDel(ovr); + } + MyFree(command->cmd->cmd); + MyFree(command->cmd); + if (command->tok) { + MyFree(command->tok->cmd); + MyFree(command->tok); + } + MyFree(command); +} diff --git a/src/api-isupport.c b/src/api-isupport.c new file mode 100644 index 000000000..613ae2cef --- /dev/null +++ b/src/api-isupport.c @@ -0,0 +1,271 @@ +/************************************************************************ + * UnrealIRCd - Unreal Internet Relay Chat Daemon - src/api-isupport.c + * (c) 2004 Dominick Meglio and the UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id$ + */ + +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include "msg.h" +#include "channel.h" +#include "version.h" +#include +#include +#include +#include +#include +#include +#include +#include "h.h" +#include "proto.h" + +Isupport *Isupports; /* List of ISUPPORT (005) tokens */ +char *IsupportStrings[5] = {0,0,0,0,0}; /* If we get more than 5 strings, God help us! */ +extern char *cmdstr; + +/** + * Builds isupport token strings. + * Respects both the 13 token limit and the 512 buffer limit. + */ +void make_isupportstrings(void) +{ + int i; + int bufsize = BUFSIZE-HOSTLEN-NICKLEN-39; + int tokcnt = 0, len = 0; + Isupport *isupport; + /* Clear out the old junk */ + for (i = 0; IsupportStrings[i]; i++) + { + free(IsupportStrings[i]); + IsupportStrings[i] = NULL; + } + + i = 0; + IsupportStrings[i] = MyMallocEx(bufsize); + for (isupport = Isupports; isupport; isupport = isupport->next) + { + int toklen; + /* Just a token */ + if (!isupport->value) + { + toklen = strlen(isupport->token); + if (tokcnt == 13 || bufsize < len+toklen+1) + { + tokcnt = 0; + len = 0; + IsupportStrings[++i] = MyMallocEx(bufsize); + } + if (IsupportStrings[i][0]) + { + strcat(IsupportStrings[i], " "); + toklen++; + } + strcat(IsupportStrings[i], isupport->token); + len += toklen; + tokcnt++; + } + else + { + toklen = strlen(isupport->token)+strlen(isupport->value)+1; + if (tokcnt == 13 || bufsize < len+toklen+1) + { + tokcnt = 0; + len = 0; + IsupportStrings[++i] = MyMallocEx(bufsize); + } + if (IsupportStrings[i][0]) + { + strcat(IsupportStrings[i], " "); + toklen++; + } + strcat(IsupportStrings[i], isupport->token); + strcat(IsupportStrings[i], "="); + strcat(IsupportStrings[i], isupport->value); + len += toklen; + tokcnt++; + } + } +} + +/** + * Initializes the builtin isupport tokens. + */ +void isupport_init(void) +{ + char tmpbuf[512]; + IsupportAdd(NULL, "EXCEPTS", NULL); +#ifdef PREFIX_AQ + IsupportAdd(NULL, "STATUSMSG", "~&@%+"); +#else + IsupportAdd(NULL, "STATUSMSG", "@%+"); +#endif + IsupportAdd(NULL, "ELIST", "MNUCT"); + ircsprintf(tmpbuf, "~,%s", extbanstr); + IsupportAdd(NULL, "EXTBAN", tmpbuf); + IsupportAdd(NULL, "CASEMAPPING", "ascii"); + IsupportAdd(NULL, "NETWORK", ircnet005); + ircsprintf(tmpbuf, CHPAR1 "%s," CHPAR2 "%s," CHPAR3 "%s," CHPAR4 "%s", + EXPAR1, EXPAR2, EXPAR3, EXPAR4); + IsupportAdd(NULL, "CHANMODES", tmpbuf); + IsupportAdd(NULL, "PREFIX", CHPFIX); + IsupportAdd(NULL, "CHANTYPES", "#"); + IsupportAdd(NULL, "MODES", my_itoa(MAXMODEPARAMS)); + IsupportAdd(NULL, "SILENCE", my_itoa(SILENCE_LIMIT)); + IsupportAdd(NULL, "WATCH", my_itoa(MAXWATCH)); + IsupportAdd(NULL, "WALLCHOPS", NULL); + IsupportAdd(NULL, "MAXTARGETS", my_itoa(MAXTARGETS)); + IsupportAdd(NULL, "AWAYLEN", my_itoa(TOPICLEN)); + IsupportAdd(NULL, "KICKLEN", my_itoa(TOPICLEN)); + IsupportAdd(NULL, "TOPICLEN", my_itoa(TOPICLEN)); + IsupportAdd(NULL, "CHANNELLEN", my_itoa(CHANNELLEN)); + IsupportAdd(NULL, "NICKLEN", my_itoa(NICKLEN)); + ircsprintf(tmpbuf, "b:%d,e:%d", MAXBANS, MAXBANS); + IsupportAdd(NULL, "MAXLIST", tmpbuf); + ircsprintf(tmpbuf, "#:%d", MAXCHANNELSPERUSER); + IsupportAdd(NULL, "CHANLIMIT", tmpbuf); + IsupportAdd(NULL, "MAXCHANNELS", my_itoa(MAXCHANNELSPERUSER)); + IsupportAdd(NULL, "HCN", NULL); + IsupportAdd(NULL, "SAFELIST", NULL); + if (cmdstr) + IsupportAdd(NULL, "CMDS", cmdstr); +} + +/** + * Sets or changes the value of an existing isupport token. + * + * @param isupport The pointer to the isupport handle. + * @param value The new value of the token (NULL indicates no value). + */ +void IsupportSetValue(Isupport *isupport, const char *value) +{ + if (isupport->value) + free(isupport->value); + if (value) + isupport->value = strdup(value); + else + isupport->value = NULL; + + make_isupportstrings(); +} + +/** + * Returns an isupport handle based on the given token name. + * + * @param token The isupport token to search for. + * @return Returns the handle to the isupport token if it was found, + * otherwise NULL is returned. + */ +Isupport *IsupportFind(const char *token) +{ + Isupport *isupport; + + for (isupport = Isupports; isupport; isupport = isupport->next) + { + if (!stricmp(token, isupport->token)) + return isupport; + } + return NULL; +} + +/** + * Adds a new isupport token. + * + * @param module The module which owns this token. + * @param token The name of the token to create. + * @param value The value of the token (NULL indicates no value). + * @return Returns the handle to the new token if successful, otherwise NULL. + * The module's error code contains specific information about the + * error. + */ +Isupport *IsupportAdd(Module *module, const char *token, const char *value) +{ + Isupport *isupport; + char *c; + + if (IsupportFind(token)) + { + if (module) + module->errorcode = MODERR_EXISTS; + return NULL; + } + /* draft-brocklesby-irc-isupport: + * token = a-zA-Z0-9 and 20 or less characters + * value = ASCII 0x21 - 0x7E + */ + for (c = (char *)token; c && *c; c++) + { + if (!isalnum(*c)) + { + if (module) + module->errorcode = MODERR_INVALID; + return NULL; + } + } + if (!token || !*token || c-token > 20) + { + if (module) + module->errorcode = MODERR_INVALID; + return NULL; + } + for (c = (char *)value; c && *c; c++) + { + if (*c < '!' || *c > '~') + { + if (module) + module->errorcode = MODERR_INVALID; + return NULL; + } + } + + isupport = MyMallocEx(sizeof(Isupport)); + isupport->owner = module; + isupport->token = strdup(token); + if (value) + isupport->value = strdup(value); + AddListItem(isupport, Isupports); + make_isupportstrings(); + if (module) + { + ModuleObject *isupportobj = MyMallocEx(sizeof(ModuleObject)); + isupportobj->object.isupport = isupport; + isupportobj->type = MOBJ_ISUPPORT; + AddListItem(isupportobj, module->objects); + module->errorcode = MODERR_NOERROR; + } + return isupport; +} + +/** + * Removes the specified isupport token. + * + * @param isupport The token to remove. + */ +void IsupportDel(Isupport *isupport) +{ + DelListItem(isupport, Isupports); + free(isupport->token); + if (isupport->value) + free(isupport->value); + free(isupport); + make_isupportstrings(); +} diff --git a/src/auth.c b/src/auth.c index 58154e68c..a10370362 100644 --- a/src/auth.c +++ b/src/auth.c @@ -46,9 +46,7 @@ anAuthStruct MODVAR AuthTypes[] = { {"crypt", AUTHTYPE_UNIXCRYPT}, {"unixcrypt", AUTHTYPE_UNIXCRYPT}, #endif -#ifdef AUTHENABLE_MD5 {"md5", AUTHTYPE_MD5}, -#endif #ifdef AUTHENABLE_SHA1 {"sha1", AUTHTYPE_SHA1}, #endif @@ -174,6 +172,278 @@ void Auth_DeleteAuthStruct(anAuthStruct *as) MyFree(as); } +/* Both values are pretty insane as of 2004, but... just in case. */ +#define MAXSALTLEN 127 +#define MAXHASHLEN 255 + +/* RAW salt length (before b64_encode) to use in /MKPASSWD + * and REAL salt length (after b64_encode, including terminating nul), + * used for reserving memory. + */ +#define RAWSALTLEN 6 +#define REALSALTLEN 12 + +/** Parses a password. + * This routine can parse a pass that has a salt (new as of unreal 3.2.1) + * and will set the 'salt' pointer and 'hash' accordingly. + * RETURN VALUES: + * 1 If succeeded, salt and hash can be used. + * 0 If it's a password without a salt ('old'), salt and hash are not touched. + */ +static int parsepass(char *str, char **salt, char **hash) +{ +static char saltbuf[MAXSALTLEN+1], hashbuf[MAXHASHLEN+1]; +char *p; +int max; + + /* Syntax: $$ */ + if (*str != '$') + return 0; + p = strchr(str+1, '$'); + if (!p || (p == str+1) || !p[1]) + return 0; + + max = p - str; + if (max > sizeof(saltbuf)) + max = sizeof(saltbuf); + strlcpy(saltbuf, str+1, max); + strlcpy(hashbuf, p+1, sizeof(hashbuf)); + *salt = saltbuf; + *hash = hashbuf; + return 1; +} + +static int authcheck_md5(aClient *cptr, anAuthStruct *as, char *para) +{ +static char buf[512]; +int i, r; +char *saltstr, *hashstr; + + if (!para) + return -1; + r = parsepass(as->data, &saltstr, &hashstr); + if (r == 0) /* Old method without salt: b64(MD5()) */ + { + char result[16]; + MD5_CTX hash; + + MD5_Init(&hash); + MD5_Update(&hash, para, strlen(para)); + MD5_Final(result, &hash); + + if ((i = b64_encode(result, sizeof(result), buf, sizeof(buf)))) + { + if (!strcmp(buf, as->data)) + return 2; + else + return -1; + } else + return -1; + } else { + /* New method with salt: b64(MD5(MD5()+salt)) */ + char result1[MAXSALTLEN+16+1]; + char result2[16]; + char rsalt[MAXSALTLEN+1]; + MD5_CTX hash; + int rsaltlen; + + /* First, decode the salt to something real... */ + rsaltlen = b64_decode(saltstr, rsalt, sizeof(rsalt)); + if (rsaltlen <= 0) + return -1; + + /* Then hash the password (1st round)... */ + MD5_Init(&hash); + MD5_Update(&hash, para, strlen(para)); + MD5_Final(result1, &hash); + + /* Add salt to result */ + memcpy(result1+16, rsalt, rsaltlen); /* b64_decode already made sure bounds are ok */ + + /* Then hash it all together again (2nd round)... */ + MD5_Init(&hash); + MD5_Update(&hash, result1, rsaltlen+16); + MD5_Final(result2, &hash); + + /* Then base64 encode it all and we are done... */ + if ((i = b64_encode(result2, sizeof(result2), buf, sizeof(buf)))) + { + if (!strcmp(buf, hashstr)) + return 2; + else + return -1; + } else + return -1; + } + return -1; /* NOTREACHED */ +} + +#ifdef AUTHENABLE_SHA1 +static int authcheck_sha1(aClient *cptr, anAuthStruct *as, char *para) +{ +char buf[512]; +int i, r; +char *saltstr, *hashstr; + + if (!para) + return -1; + r = parsepass(as->data, &saltstr, &hashstr); + if (r) + { + /* New method with salt: b64(SHA1(SHA1()+salt)) */ + char result1[MAXSALTLEN+20+1]; + char result2[20]; + char rsalt[MAXSALTLEN+1]; + int rsaltlen; +#ifndef _WIN32 + SHA_CTX hash; +#else + HCRYPTPROV hProv; + HCRYPTHASH hHash; + DWORD size = 20; +#endif + + /* First, decode the salt to something real... */ + rsaltlen = b64_decode(saltstr, rsalt, sizeof(rsalt)); + if (rsaltlen <= 0) + return -1; + +#ifdef _WIN32 + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + return -1; +#endif + + /* Then hash the password (1st round)... */ +#ifndef _WIN32 + SHA1_Init(&hash); + SHA1_Update(&hash, para, strlen(para)); + SHA1_Final(result1, &hash); +#else + if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) return NULL; + if (!CryptHashData(hHash, para, strlen(para), 0)) return NULL; + if (!CryptGetHashParam(hHash, HP_HASHVAL, result1, &size, 0)) return NULL; + CryptDestroyHash(hHash); +#endif + /* Add salt to result */ + memcpy(result1+20, rsalt, rsaltlen); /* b64_decode already made sure bounds are ok */ + + /* Then hash it all together again (2nd round)... */ +#ifndef _WIN32 + SHA1_Init(&hash); + SHA1_Update(&hash, result1, rsaltlen+20); + SHA1_Final(result2, &hash); +#else + if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) return NULL; + if (!CryptHashData(hHash, result1, 20+rsaltlen, 0)) return NULL; + if (!CryptGetHashParam(hHash, HP_HASHVAL, result2, &size, 0)) return NULL; + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); +#endif + /* Then base64 encode it all and we are done... */ + if ((i = b64_encode(result2, sizeof(result2), buf, sizeof(buf)))) + { + if (!strcmp(buf, hashstr)) + return 2; + else + return -1; + } else + return -1; + } else { + /* OLD auth */ +#ifndef _WIN32 + if ((i = b64_encode(SHA1(para, strlen(para), NULL), 20, buf, sizeof(buf)))) + { + if (!strcmp(buf, as->data)) + return 2; + else + return -1; + } else + return -1; +#else + HCRYPTPROV hProv; + HCRYPTHASH hHash; + char buf2[512]; + DWORD size = 512; + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) + return -1; + if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) + return -1; + if (!CryptHashData(hHash, para, strlen(para), 0)) + return -1; + if (!CryptGetHashParam(hHash, HP_HASHVAL, buf, &size, 0)) + return -1; + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + b64_encode(buf, 20, buf2, sizeof(buf2)); + if (!strcmp(buf2, as->data)) + return 2; + else + return -1; +#endif + } +} +#endif /* AUTHENABLE_SHA1 */ + +#ifdef AUTHENABLE_RIPEMD160 +static int authcheck_ripemd160(aClient *cptr, anAuthStruct *as, char *para) +{ +char buf[512]; +int i, r; +char *saltstr, *hashstr; + + if (!para) + return -1; + r = parsepass(as->data, &saltstr, &hashstr); + if (r) + { + /* New method with salt: b64(RIPEMD160(RIPEMD160()+salt)) */ + char result1[MAXSALTLEN+20+1]; + char result2[20]; + char rsalt[MAXSALTLEN+1]; + int rsaltlen; + RIPEMD160_CTX hash; + + /* First, decode the salt to something real... */ + rsaltlen = b64_decode(saltstr, rsalt, sizeof(rsalt)); + if (rsaltlen <= 0) + return -1; + + /* Then hash the password (1st round)... */ + RIPEMD160_Init(&hash); + RIPEMD160_Update(&hash, para, strlen(para)); + RIPEMD160_Final(result1, &hash); + /* Add salt to result */ + memcpy(result1+20, rsalt, rsaltlen); /* b64_decode already made sure bounds are ok */ + + /* Then hash it all together again (2nd round)... */ + RIPEMD160_Init(&hash); + RIPEMD160_Update(&hash, result1, rsaltlen+20); + RIPEMD160_Final(result2, &hash); + /* Then base64 encode it all and we are done... */ + if ((i = b64_encode(result2, sizeof(result2), buf, sizeof(buf)))) + { + if (!strcmp(buf, hashstr)) + return 2; + else + return -1; + } else + return -1; + } else { + /* OLD auth */ + if ((i = b64_encode(RIPEMD160(para, strlen(para), NULL), 20, buf, sizeof(buf)))) + { + if (!strcmp(buf, as->data)) + return 2; + else + return -1; + } else + return -1; + } +} +#endif /* AUTHENABLE_RIPEMD160 */ + + /* * cptr MUST be a local client * as is what it will be compared with @@ -192,16 +462,13 @@ int Auth_Check(aClient *cptr, anAuthStruct *as, char *para) #ifdef AUTHENABLE_UNIXCRYPT extern char *crypt(); #endif -#if defined(AUTHENABLE_MD5) || defined(AUTHENABLE_SHA1) || defined(AUTHENABLE_RIPEMD160) - static char buf[512]; - int i; -#endif #ifdef AUTHENABLE_SSL_CLIENTCERT X509 *x509_clientcert = NULL; X509 *x509_filecert = NULL; FILE *x509_f = NULL; #endif + if (!as) return 1; @@ -229,108 +496,17 @@ int Auth_Check(aClient *cptr, anAuthStruct *as, char *para) return -1; break; #endif -#ifdef AUTHENABLE_MD5 case AUTHTYPE_MD5: - if (!para) - return -1; -#ifndef _WIN32 - if ((i = b64_encode(MD5(para, strlen(para), NULL), - MD5_DIGEST_LENGTH, buf, sizeof(buf)))) - { - if (!strcmp(buf, as->data)) - return 2; - else - return -1; - } - else - return -1; - break; -#else - { - HCRYPTPROV hProv; - HCRYPTHASH hHash; - char buf2[512]; - DWORD size = 512; - if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT)) - return -1; - if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) - return -1; - if (!CryptHashData(hHash, para, strlen(para), 0)) - return -1; - if (!CryptGetHashParam(hHash, HP_HASHVAL, buf, &size, 0)) - return -1; - CryptDestroyHash(hHash); - CryptReleaseContext(hProv, 0); - b64_encode(buf, 16, buf2, sizeof(buf2)); - if (!strcmp(buf2, as->data)) - return 2; - else - return -1; - } + return authcheck_md5(cptr, as, para); break; - -#endif -#endif #ifdef AUTHENABLE_SHA1 case AUTHTYPE_SHA1: - if (!para) - return -1; -#ifndef _WIN32 - - if ((i = b64_encode(SHA1(para, strlen(para), NULL), - SHA_DIGEST_LENGTH, buf, sizeof(buf)))) - { - if (!strcmp(buf, as->data)) - return 2; - else - return -1; - } - else - return -1; - break; -#else - { - HCRYPTPROV hProv; - HCRYPTHASH hHash; - char buf2[512]; - DWORD size = 512; - if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT)) - return -1; - if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) - return -1; - if (!CryptHashData(hHash, para, strlen(para), 0)) - return -1; - if (!CryptGetHashParam(hHash, HP_HASHVAL, buf, &size, 0)) - return -1; - CryptDestroyHash(hHash); - CryptReleaseContext(hProv, 0); - b64_encode(buf, 20, buf2, sizeof(buf2)); - if (!strcmp(buf2, as->data)) - return 2; - else - return -1; - } + return authcheck_sha1(cptr, as, para); break; #endif -#endif #ifdef AUTHENABLE_RIPEMD160 case AUTHTYPE_RIPEMD160: - if (!para) - return -1; - - if ((i = b64_encode(RIPEMD160(para, strlen(para), NULL), - RIPEMD160_DIGEST_LENGTH, buf, sizeof(buf)))) - { - if (!strcmp(buf, as->data)) - return 2; - else - return -1; - } - else - return -1; - break; + return authcheck_ripemd160(cptr, as, para); #endif #ifdef AUTHENABLE_SSL_CLIENTCERT case AUTHTYPE_SSL_CLIENTCERT: @@ -367,19 +543,202 @@ int Auth_Check(aClient *cptr, anAuthStruct *as, char *para) return -1; } +static char *mkpass_md5(char *para) +{ +static char buf[128]; +char result1[16+REALSALTLEN]; +char result2[16]; +char saltstr[REALSALTLEN]; /* b64 encoded printable string*/ +char saltraw[RAWSALTLEN]; /* raw binary */ +char xresult[64]; +MD5_CTX hash; +int i; + + if (!para) return NULL; + + /* generate a random salt... */ + for (i=0; i < RAWSALTLEN; i++) + saltraw[i] = getrandom8(); + + i = b64_encode(saltraw, RAWSALTLEN, saltstr, REALSALTLEN); + if (!i) return NULL; + + /* b64(MD5(MD5()+salt)) + * ^^^^^^^^^^^ + * step 1 + * ^^^^^^^^^^^^^^^^^^^^^ + * step 2 + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * step 3 + */ + + /* STEP 1 */ + MD5_Init(&hash); + MD5_Update(&hash, para, strlen(para)); + MD5_Final(result1, &hash); + + /* STEP 2 */ + /* add salt to result */ + memcpy(result1+16, saltraw, RAWSALTLEN); + /* Then hash it all together */ + MD5_Init(&hash); + MD5_Update(&hash, result1, RAWSALTLEN+16); + MD5_Final(result2, &hash); + + /* STEP 3 */ + /* Then base64 encode it all together.. */ + i = b64_encode(result2, sizeof(result2), xresult, sizeof(xresult)); + if (!i) return NULL; + + /* Good.. now create the whole string: + * $$ + */ + ircsprintf(buf, "$%s$%s", saltstr, xresult); + return buf; +} + +#ifdef AUTHENABLE_SHA1 +static char *mkpass_sha1(char *para) +{ +static char buf[128]; +char result1[20+REALSALTLEN]; +char result2[20]; +char saltstr[REALSALTLEN]; /* b64 encoded printable string*/ +char saltraw[RAWSALTLEN]; /* raw binary */ +char xresult[64]; +#ifndef _WIN32 +SHA_CTX hash; +#else +HCRYPTPROV hProv; +HCRYPTHASH hHash; +DWORD size = 20; +#endif +int i; + + if (!para) return NULL; + + /* generate a random salt... */ + for (i=0; i < RAWSALTLEN; i++) + saltraw[i] = getrandom8(); + + i = b64_encode(saltraw, RAWSALTLEN, saltstr, REALSALTLEN); + if (!i) return NULL; + +#ifdef _WIN32 + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + return NULL; +#endif + + /* b64(SHA1(SHA1()+salt)) + * ^^^^^^^^^^^ + * step 1 + * ^^^^^^^^^^^^^^^^^^^^^ + * step 2 + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * step 3 + */ + + /* STEP 1 */ +#ifndef _WIN32 + SHA1_Init(&hash); + SHA1_Update(&hash, para, strlen(para)); + SHA1_Final(result1, &hash); +#else + if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) return NULL; + if (!CryptHashData(hHash, para, strlen(para), 0)) return NULL; + if (!CryptGetHashParam(hHash, HP_HASHVAL, result1, &size, 0)) return NULL; + CryptDestroyHash(hHash); +#endif + /* STEP 2 */ + /* add salt to result */ + memcpy(result1+20, saltraw, RAWSALTLEN); + /* Then hash it all together */ +#ifndef _WIN32 + SHA1_Init(&hash); + SHA1_Update(&hash, result1, RAWSALTLEN+20); + SHA1_Final(result2, &hash); +#else + if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) return NULL; + if (!CryptHashData(hHash, result1, RAWSALTLEN+20, 0)) return NULL; + if (!CryptGetHashParam(hHash, HP_HASHVAL, result2, &size, 0)) return NULL; + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); +#endif + /* STEP 3 */ + /* Then base64 encode it all together.. */ + i = b64_encode(result2, sizeof(result2), xresult, sizeof(xresult)); + if (!i) return NULL; + + /* Good.. now create the whole string: + * $$ + */ + ircsprintf(buf, "$%s$%s", saltstr, xresult); + return buf; +} +#endif /* AUTHENABLE_SHA1 */ + +#ifdef AUTHENABLE_RIPEMD160 +static char *mkpass_ripemd160(char *para) +{ +static char buf[128]; +char result1[20+REALSALTLEN]; +char result2[20]; +char saltstr[REALSALTLEN]; /* b64 encoded printable string*/ +char saltraw[RAWSALTLEN]; /* raw binary */ +char xresult[64]; +RIPEMD160_CTX hash; +int i; + + if (!para) return NULL; + + /* generate a random salt... */ + for (i=0; i < RAWSALTLEN; i++) + saltraw[i] = getrandom8(); + + i = b64_encode(saltraw, RAWSALTLEN, saltstr, REALSALTLEN); + if (!i) return NULL; + + /* b64(RIPEMD160(RIPEMD160()+salt)) + * ^^^^^^^^^^^ + * step 1 + * ^^^^^^^^^^^^^^^^^^^^^ + * step 2 + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * step 3 + */ + + /* STEP 1 */ + RIPEMD160_Init(&hash); + RIPEMD160_Update(&hash, para, strlen(para)); + RIPEMD160_Final(result1, &hash); + + /* STEP 2 */ + /* add salt to result */ + memcpy(result1+20, saltraw, RAWSALTLEN); + /* Then hash it all together */ + RIPEMD160_Init(&hash); + RIPEMD160_Update(&hash, result1, RAWSALTLEN+20); + RIPEMD160_Final(result2, &hash); + + /* STEP 3 */ + /* Then base64 encode it all together.. */ + i = b64_encode(result2, sizeof(result2), xresult, sizeof(xresult)); + if (!i) return NULL; + + /* Good.. now create the whole string: + * $$ + */ + ircsprintf(buf, "$%s$%s", saltstr, xresult); + return buf; +} +#endif /* AUTHENABLE_RIPEMD160 */ + char *Auth_Make(short type, char *para) { #ifdef AUTHENABLE_UNIXCRYPT char salt[3]; extern char *crypt(); #endif -#if defined(AUTHENABLE_MD5) || defined(AUTHENABLE_SHA1) || defined(AUTHENABLE_RIPEMD160) - static char buf[512]; - int i; -#endif -#ifdef _WIN32 - static char buf2[512]; -#endif switch (type) { @@ -397,92 +756,20 @@ char *Auth_Make(short type, char *para) return(crypt(para, salt)); break; #endif -#ifdef AUTHENABLE_MD5 + case AUTHTYPE_MD5: - if (!para) - return NULL; -#ifndef _WIN32 - - if ((i = b64_encode(MD5(para, strlen(para), NULL), - MD5_DIGEST_LENGTH, buf, sizeof(buf)))) - { - return (buf); - } - else - return NULL; - break; -#else - { - HCRYPTPROV hProv; - HCRYPTHASH hHash; - DWORD size = 512; - if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT)) - return NULL; - if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) - return NULL; - if (!CryptHashData(hHash, para, strlen(para), 0)) - return NULL; - if (!CryptGetHashParam(hHash, HP_HASHVAL, buf, &size, 0)) - return NULL; - CryptDestroyHash(hHash); - CryptReleaseContext(hProv, 0); - b64_encode(buf, 16, buf2, sizeof(buf2)); - return (buf2); - } - break; -#endif -#endif + return mkpass_md5(para); + #ifdef AUTHENABLE_SHA1 case AUTHTYPE_SHA1: - if (!para) - return NULL; -#ifndef _WIN32 - if ((i = b64_encode(SHA1(para, strlen(para), NULL), - SHA_DIGEST_LENGTH, buf, sizeof(buf)))) - { - return (buf); - } - else - return NULL; - break; -#else - { - HCRYPTPROV hProv; - HCRYPTHASH hHash; - DWORD size = 512; - if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT)) - return NULL; - if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) - return NULL; - if (!CryptHashData(hHash, para, strlen(para), 0)) - return NULL; - if (!CryptGetHashParam(hHash, HP_HASHVAL, buf, &size, 0)) - return NULL; - CryptDestroyHash(hHash); - CryptReleaseContext(hProv, 0); - b64_encode(buf, 20, buf2, sizeof(buf2)); - return (buf2); - } - break; + return mkpass_sha1(para); #endif -#endif #ifdef AUTHENABLE_RIPEMD160 case AUTHTYPE_RIPEMD160: - if (!para) - return NULL; - - if ((i = b64_encode(RIPEMD160(para, strlen(para), NULL), - RIPEMD160_DIGEST_LENGTH, buf, sizeof(buf)))) - { - return (buf); - } - else - return NULL; - break; + return mkpass_ripemd160(para); #endif + default: return (NULL); } diff --git a/src/badwords.c b/src/badwords.c index 26d580099..19f1f3a06 100644 --- a/src/badwords.c +++ b/src/badwords.c @@ -185,7 +185,7 @@ char *stripbadwords(char *str, ConfigItem_badword *start_bw, int *blocked) static char cleanstr[4096]; char buf[4096]; char *ptr; - int matchlen, stringlen, cleaned; + int matchlen, m, stringlen, cleaned; ConfigItem_badword *this_word; *blocked = 0; @@ -244,8 +244,11 @@ char *stripbadwords(char *str, ConfigItem_badword *start_bw, int *blocked) { if (pmatch[0].rm_so == -1) break; + m = pmatch[0].rm_eo - pmatch[0].rm_so; + if (m == 0) + break; /* anti-loop */ cleaned = 1; - matchlen += pmatch[0].rm_eo - pmatch[0].rm_so; + matchlen += m; strlncat(buf, ptr, sizeof buf, pmatch[0].rm_so); if (this_word->replace) strlcat(buf, this_word->replace, sizeof buf); diff --git a/src/channel.c b/src/channel.c index 57962f92f..f525965a4 100644 --- a/src/channel.c +++ b/src/channel.c @@ -582,7 +582,7 @@ Ban *is_banned(aClient *sptr, aChannel *chptr, int type) if (MyConnect(sptr)) { mine = 1; - s = make_nick_user_host(sptr->name, sptr->user->username, sptr->sockhost); + s = make_nick_user_host(sptr->name, sptr->user->username, GetIP(sptr)); strlcpy(nuip, s, sizeof nuip); ban_ip = nuip; } @@ -864,8 +864,7 @@ int can_send(aClient *cptr, aChannel *chptr, char *msgtext, int notice) (!lp || !(lp->flags & (CHFL_CHANOP|CHFL_VOICE|CHFL_CHANOWNER|CHFL_HALFOP|CHFL_CHANPROT))) && !is_irc_banned(chptr)) { - sendto_chanops_butone(cptr, chptr, ":IRC PRIVMSG %s :%s: %s", - chptr->chname, cptr->name, msgtext); + sendto_chmodemucrap(cptr, chptr, msgtext); return (CANNOT_SEND_MODERATED); } } @@ -2975,14 +2974,17 @@ void set_mode(aChannel *chptr, aClient *cptr, int parc, char *parv[], u_int *pco } #endif } - if (found == 0) + if (found == 0) /* Mode char unknown */ { - if (!MyClient(cptr)) - break; - /* don't flood other servers */ - sendto_one(cptr, - err_str(ERR_UNKNOWNMODE), - me.name, cptr->name, *curchr); + /* temporary hack: eat parameters of certain future chanmodes.. */ + if (*curchr == 'I') + paracount++; + if ((*curchr == 'j') && (what == MODE_ADD)) + paracount++; + + if (MyClient(cptr)) + sendto_one(cptr, err_str(ERR_UNKNOWNMODE), + me.name, cptr->name, *curchr); break; } @@ -3703,6 +3705,8 @@ void join_channel(aChannel *chptr, aClient *cptr, aClient *sptr, int flags) parv[1] = chptr->chname; (void)m_names(cptr, sptr, 2, parv); RunHook4(HOOKTYPE_LOCAL_JOIN, cptr, sptr,chptr,parv); + } else { + RunHook4(HOOKTYPE_REMOTE_JOIN, cptr, sptr, chptr, parv); /* (rarely used) */ } #ifdef NEWCHFLOODPROT @@ -4130,6 +4134,8 @@ CMD_FUNC(m_part) } if (MyClient(sptr)) RunHook4(HOOKTYPE_LOCAL_PART, cptr, sptr, chptr, comment); + else + RunHook4(HOOKTYPE_REMOTE_PART, cptr, sptr, chptr, comment); remove_user_from_channel(sptr, chptr); } diff --git a/src/cloak.c b/src/cloak.c index 4fadc4731..d0dfab785 100644 --- a/src/cloak.c +++ b/src/cloak.c @@ -157,8 +157,8 @@ char host[256], *mask, *x, *p, *q; if (!curr) return NULL; - strlcpy(host, curr, sizeof(curr)); - for (p = curr, q = host; *p; p++, q++) + /* Convert host to lowercase and cut off at 255 bytes just to be sure */ + for (p = curr, q = host; *p && (q < host+sizeof(host)-1); p++, q++) *q = tolower(*p); *q = '\0'; diff --git a/src/extbans.c b/src/extbans.c index ebc11c72a..d4205701d 100644 --- a/src/extbans.c +++ b/src/extbans.c @@ -76,6 +76,7 @@ Extban *ExtbanAdd(Module *module, ExtbanInfo req) { Extban *tmp; int slot; +char tmpbuf[512]; if (findmod_by_bantype(req.flag)) { @@ -108,12 +109,18 @@ int slot; module->errorcode = MODERR_NOERROR; } ExtBan_highest = slot; - make_extbanstr(); + if (loop.ircd_booted) + { + make_extbanstr(); + ircsprintf(tmpbuf, "~,%s", extbanstr); + IsupportSetValue(IsupportFind("EXTBAN"), tmpbuf); + } return &ExtBan_Table[slot]; } void ExtbanDel(Extban *eb) { +char tmpbuf[512]; /* Just zero it all away.. */ if (eb->owner) @@ -131,6 +138,8 @@ void ExtbanDel(Extban *eb) } memset(eb, 0, sizeof(Extban)); make_extbanstr(); + ircsprintf(tmpbuf, "~,%s", extbanstr); + IsupportSetValue(IsupportFind("EXTBAN"), tmpbuf); /* Hmm do we want to go trough all chans and remove the bans? * I would say 'no' because perhaps we are just reloading, * and else.. well... screw them? @@ -195,6 +204,9 @@ char *ban = banin + 3; if (type != BANCHK_NICK) return 0; + + if (has_voice(sptr, chptr)) + return 0; if ((ban_realhost && !match(ban, ban_realhost)) || (ban_virthost && !match(ban, ban_virthost)) || diff --git a/src/extcmodes.c b/src/extcmodes.c index 03eba2438..0a4ce5056 100644 --- a/src/extcmodes.c +++ b/src/extcmodes.c @@ -115,6 +115,7 @@ void extcmode_init(void) Cmode *CmodeAdd(Module *reserved, CmodeInfo req, Cmode_t *mode) { short i = 0, j = 0; + char tmpbuf[512]; while (i < EXTCMODETABLESZ) { @@ -150,21 +151,31 @@ Cmode *CmodeAdd(Module *reserved, CmodeInfo req, Cmode_t *mode) if (Channelmode_Table[j].flag) if (j > Channelmode_highest) Channelmode_highest = j; - make_cmodestr(); - make_extcmodestr(); if (reserved) reserved->errorcode = MODERR_NOERROR; + if (loop.ircd_booted) + { + make_cmodestr(); + make_extcmodestr(); + ircsprintf(tmpbuf, CHPAR1 "%s," CHPAR2 "%s," CHPAR3 "%s," CHPAR4 "%s", + EXPAR1, EXPAR2, EXPAR3, EXPAR4); + IsupportSetValue(IsupportFind("CHANMODES"), tmpbuf); + } return &(Channelmode_Table[i]); } void CmodeDel(Cmode *cmode) { + char tmpbuf[512]; /* TODO: remove from all channel */ if (cmode) cmode->flag = '\0'; make_cmodestr(); make_extcmodestr(); /* Not unloadable, so module object support is not needed (yet) */ + ircsprintf(tmpbuf, CHPAR1 "%s," CHPAR2 "%s," CHPAR3 "%s," CHPAR4 "%s", + EXPAR1, EXPAR2, EXPAR3, EXPAR4); + IsupportSetValue(IsupportFind("CHANMODES"), tmpbuf); } /** searches in chptr extmode parameters and returns entry or NULL. */ diff --git a/src/ircd.c b/src/ircd.c index 516db2bb8..af6288085 100644 --- a/src/ircd.c +++ b/src/ircd.c @@ -604,6 +604,17 @@ extern TS check_pings(TS currenttime) } } + /* Do spamfilter 'user' banchecks.. */ + if (loop.do_bancheck_spamf_user && IsPerson(cptr)) + { + if (find_spamfilter_user(cptr) == FLUSH_BUFFER) + continue; + } + if (loop.do_bancheck_spamf_away && IsPerson(cptr) && cptr->user->away) + { + if (dospamfilter(cptr, cptr->user->away, SPAMF_AWAY, NULL) == FLUSH_BUFFER) + continue; + } /* * We go into ping phase */ @@ -725,8 +736,7 @@ extern TS check_pings(TS currenttime) * * - lucas * * */ - if (loop.do_bancheck) - loop.do_bancheck = 0; + loop.do_bancheck = loop.do_bancheck_spamf_user = loop.do_bancheck_spamf_away = 0; Debug((DEBUG_NOTICE, "Next check_ping() call at: %s, %d %d %d", myctime(currenttime+9), ping, currenttime+9, currenttime)); @@ -1253,6 +1263,8 @@ int InitwIRCD(int argc, char *argv[]) #ifdef EXTCMODE make_extcmodestr(); #endif + make_extbanstr(); + isupport_init(); if (!find_Command_simple("AWAY") /*|| !find_Command_simple("KILL") || !find_Command_simple("OPER") || !find_Command_simple("PING")*/) { diff --git a/src/ircsprintf.c b/src/ircsprintf.c index ee400f352..23a961241 100644 --- a/src/ircsprintf.c +++ b/src/ircsprintf.c @@ -305,28 +305,6 @@ char *ircvsprintf(char *str, const char *format, va_list vl) *str++ = '0'; continue; } - if (v1 < 6L) - switch (v1) - { - case 0L: - *str++ = '0'; - continue; - case 1L: - *str++ = '1'; - continue; - case 2L: - *str++ = '1'; - continue; - case 3L: - *str++ = '1'; - continue; - case 4L: - *str++ = '1'; - continue; - case 5L: - *str++ = '1'; - continue; - } if (v1 > 999999999L) { v2 = v1 / 1000000000; diff --git a/src/md5.c b/src/md5.c index 586de0c26..05949ca17 100644 --- a/src/md5.c +++ b/src/md5.c @@ -15,6 +15,7 @@ * and avoid compile-time configuration. */ +#include "config.h" #if !defined(USE_SSL) #include diff --git a/src/modules.c b/src/modules.c index b6ad47c23..ee4ceda57 100644 --- a/src/modules.c +++ b/src/modules.c @@ -61,6 +61,7 @@ Callback *Callbacks[MAXCALLBACKS]; /* Callback objects for modules, used for reh Callback *RCallbacks[MAXCALLBACKS]; /* 'Real' callback function, used for callback function calls */ MODVAR Module *Modules = NULL; MODVAR Versionflag *Versionflags = NULL; + int Module_Depend_Resolve(Module *p); Module *Module_make(ModuleHeader *header, #ifdef _WIN32 @@ -459,6 +460,9 @@ void Unload_all_loaded_modules(void) else if (objs->type == MOBJ_CALLBACK) { CallbackDel(objs->object.callback); } + else if (objs->type == MOBJ_ISUPPORT) { + IsupportDel(objs->object.isupport); + } } for (child = mi->children; child; child = childnext) { @@ -519,6 +523,9 @@ void Unload_all_testing_modules(void) else if (objs->type == MOBJ_CALLBACK) { CallbackDel(objs->object.callback); } + else if (objs->type == MOBJ_ISUPPORT) { + IsupportDel(objs->object.isupport); + } } for (child = mi->children; child; child = childnext) { @@ -585,6 +592,10 @@ int Module_free(Module *mod) else if (objs->type == MOBJ_CALLBACK) { CallbackDel(objs->object.callback); } + else if (objs->type == MOBJ_ISUPPORT) { + IsupportDel(objs->object.isupport); + } + } for (p = Modules; p; p = p->next) { @@ -1317,11 +1328,15 @@ static const char *module_error_str[] = { "No error", "Object already exists", "No space available", - "Invalid parameter(s)" + "Invalid parameter(s)", + "Object was not found" }; const char *ModuleGetErrorStr(Module *module) { + if (module->errorcode >= sizeof(module_error_str)/sizeof(module_error_str[0])) + return NULL; + return module_error_str[module->errorcode]; } diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in index 59c3e3683..62e12dcdd 100644 --- a/src/modules/Makefile.in +++ b/src/modules/Makefile.in @@ -18,18 +18,22 @@ #* #* $Id$ #*/ +# major edit from fez - to compile objects individually... INCLUDES = ../include/struct.h ../include/config.h \ ../include/sys.h ../include/common.h ../include/version.h \ ../include/h.h ../include/numeric.h ../include/msg.h \ ../include/dynconf.h ../include/modules.h ../include/setup.h -R_MODULES=m_sethost.so m_chghost.so m_chgident.so m_setname.so \ - m_setident.so m_sdesc.so m_svsmode.so m_swhois.so\ - m_svsmotd.so m_svsnline.so m_who.so m_mkpasswd.so \ - m_away.so m_svsnoop.so m_svso.so m_svsnick.so \ +#just changing this to cloak.so oldcloak.so could be a ./Config option... +#R_MODULES=cloak.so oldcloak.so +R_MODULES= \ + m_sethost.so m_chghost.so m_chgident.so m_setname.so \ + m_setident.so m_sdesc.so m_svsmode.so m_swhois.so\ + m_svsmotd.so m_svsnline.so m_who.so m_mkpasswd.so \ + m_away.so m_svsnoop.so m_svso.so m_svsnick.so \ m_adminchat.so m_akill.so m_chgname.so m_guest.so m_htm.so m_kill.so \ - m_lag.so m_message.so m_nachat.so m_oper.so m_pingpong.so \ + m_lag.so m_message.so m_nachat.so m_oper.so m_pingpong.so \ m_quit.so m_rakill.so m_rping.so m_sendumode.so m_sqline.so \ m_tsctl.so m_unkline.so m_unsqline.so m_unzline.so m_whois.so \ m_tkl.so m_vhost.so m_cycle.so m_svsjoin.so m_svspart.so \ @@ -42,26 +46,27 @@ R_MODULES=m_sethost.so m_chghost.so m_chgident.so m_setname.so \ m_trace.so m_netinfo.so m_links.so m_help.so m_rules.so \ m_close.so m_map.so m_eos.so m_server.so m_stats.so \ m_svsfline.so m_dccdeny.so m_undccdeny.so m_whowas.so \ - m_connect.so cloak.so oldcloak.so m_dccallow.so + m_connect.so m_dccallow.so m_userip.so cloak.so oldcloak.so -COMMANDS=m_sethost.c m_chghost.c m_chgident.c m_setname.c m_setident.c \ - m_sdesc.c m_svsmode.c m_swhois.c m_svsmotd.c m_svsnline.c \ - m_who.c m_mkpasswd.c m_away.c m_svsnoop.c m_svso.c m_svsnick.c \ - m_adminchat.c m_akill.c m_chgname.c m_guest.c m_htm.c m_kill.c \ - m_lag.c m_message.c m_nachat.c m_oper.c m_pingpong.c \ - m_quit.c m_rakill.c m_rping.c m_sendumode.c m_sqline.c \ - m_tsctl.c m_unkline.c m_unsqline.c m_unzline.c m_whois.c \ - m_tkl.c m_vhost.c m_cycle.c m_svsjoin.c m_svspart.c \ - m_svslusers.c m_svswatch.c m_svssilence.c m_sendsno.c \ - m_svssno.c m_sajoin.c m_sapart.c m_samode.c m_kick.c m_topic.c \ - m_invite.c m_list.c m_time.c m_svskill.c m_sjoin.c \ - m_pass.c m_userhost.c m_ison.c m_silence.c m_knock.c m_umode2.c \ - m_squit.c m_protoctl.c m_addline.c m_addmotd.c m_addomotd.c \ - m_wallops.c m_admin.c m_globops.c m_locops.c m_chatops.c \ - m_trace.c m_netinfo.c m_links.c m_help.c m_rules.c \ - m_close.c m_map.c m_eos.c m_server.c m_stats.c \ - m_svsfline.c m_dccdeny.c m_undccdeny.c m_whowas.c \ - m_connect.c m_dccallow.c +#note change of .c to .o +COMMANDS=m_sethost.o m_chghost.o m_chgident.o m_setname.o m_setident.o \ + m_sdesc.o m_svsmode.o m_swhois.o m_svsmotd.o m_svsnline.o \ + m_who.o m_mkpasswd.o m_away.o m_svsnoop.o m_svso.o m_svsnick.o \ + m_adminchat.o m_akill.o m_chgname.o m_guest.o m_htm.o m_kill.o \ + m_lag.o m_message.o m_nachat.o m_oper.o m_pingpong.o \ + m_quit.o m_rakill.o m_rping.o m_sendumode.o m_sqline.o \ + m_tsctl.o m_unkline.o m_unsqline.o m_unzline.o m_whois.o \ + m_tkl.o m_vhost.o m_cycle.o m_svsjoin.o m_svspart.o \ + m_svslusers.o m_svswatch.o m_svssilence.o m_sendsno.o \ + m_svssno.o m_sajoin.o m_sapart.o m_samode.o m_kick.o m_topic.o \ + m_invite.o m_list.o m_time.o m_svskill.o m_sjoin.o \ + m_pass.o m_userhost.o m_ison.o m_silence.o m_knock.o m_umode2.o \ + m_squit.o m_protoctl.o m_addline.o m_addmotd.o m_addomotd.o \ + m_wallops.o m_admin.o m_globops.o m_locops.o m_chatops.o \ + m_trace.o m_netinfo.o m_links.o m_help.o m_rules.o \ + m_close.o m_map.o m_eos.o m_server.o m_stats.o \ + m_svsfline.o m_dccdeny.o m_undccdeny.o m_whowas.o \ + m_connect.o m_dccallow.o m_userip.o MODULES=commands.so $(R_MODULES) @@ -79,6 +84,284 @@ commands.so: l_commands.c $(COMMANDS) $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -o commands.so l_commands.c \ $(COMMANDS) +############################################################################# +# commands.so's .o's section +############################################################################# + +m_adminchat.o: m_adminchat.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_adminchat.c + +m_akill.o: m_akill.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_akill.c + +m_chgname.o: m_chgname.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_chgname.c + +m_guest.o: m_guest.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_guest.c + +m_htm.o: m_htm.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_htm.c + +m_kill.o: m_kill.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_kill.c + +m_lag.o: m_lag.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_lag.c + +m_message.o: m_message.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_message.c + +m_nachat.o: m_nachat.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_nachat.c + +m_oper.o: m_oper.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_oper.c + +m_pingpong.o: m_pingpong.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_pingpong.c + +m_quit.o: m_quit.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_quit.c + +m_rakill.o: m_rakill.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_rakill.c + +m_rping.o: m_rping.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_rping.c + +m_sendumode.o: m_sendumode.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sendumode.c + +m_sqline.o: m_sqline.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sqline.c + +m_tsctl.o: m_tsctl.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_tsctl.c + +m_unkline.o: m_unkline.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_unkline.c + +m_unsqline.o: m_unsqline.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_unsqline.c + +m_unzline.o: m_unzline.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_unzline.c + +m_whois.o: m_whois.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_whois.c + +m_sethost.o: m_sethost.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sethost.c + +m_chghost.o: m_chghost.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_chghost.c + +m_chgident.o: m_chgident.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_chgident.c + +m_setident.o: m_setident.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_setident.c + +m_setname.o: m_setname.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_setname.c + +m_sdesc.o: m_sdesc.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sdesc.c + +m_svsmode.o: m_svsmode.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svsmode.c + +m_swhois.o: m_swhois.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_swhois.c + +m_svsmotd.o: m_svsmotd.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svsmotd.c + +m_svsnline.o: m_svsnline.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svsnline.c + +m_who.o: m_who.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_who.c + +m_mkpasswd.o: m_mkpasswd.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_mkpasswd.c + +m_away.o: m_away.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_away.c + +m_svsnoop.o: m_svsnoop.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svsnoop.c + +m_svso.o: m_svso.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svso.c + +m_svsnick.o: m_svsnick.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svsnick.c + +m_tkl.o: m_tkl.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_tkl.c + +m_vhost.o: m_vhost.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_vhost.c + +m_cycle.o: m_cycle.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_cycle.c + +m_svsjoin.o: m_svsjoin.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svsjoin.c + +m_svspart.o: m_svspart.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svspart.c + +m_svslusers.o: m_svslusers.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svslusers.c + +m_svswatch.o: m_svswatch.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svswatch.c + +m_svssilence.o: m_svssilence.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svssilence.c + +m_sendsno.o: m_sendsno.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sendsno.c + +m_svssno.o: m_svssno.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svssno.c + +m_sajoin.o: m_sajoin.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sajoin.c + +m_sapart.o: m_sapart.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sapart.c + +m_samode.o: m_samode.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_samode.c + +m_kick.o: m_kick.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_kick.c + +m_topic.o: m_topic.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_topic.c + +m_invite.o: m_invite.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_invite.c + +m_list.o: m_list.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_list.c + +m_time.o: m_time.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_time.c + +m_svskill.o: m_svskill.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svskill.c + +m_sjoin.o: m_sjoin.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_sjoin.c + +m_pass.o: m_pass.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_pass.c + +m_userhost.o: m_userhost.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_userhost.c + +m_ison.o: m_ison.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_ison.c + +m_silence.o: m_silence.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_silence.c + +m_knock.o: m_knock.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_knock.c + +m_umode2.o: m_umode2.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_umode2.c + +m_squit.o: m_squit.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_squit.c + +m_protoctl.o: m_protoctl.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_protoctl.c + +m_addline.o: m_addline.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_addline.c + +m_addmotd.o: m_addmotd.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_addmotd.c + +m_addomotd.o: m_addomotd.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_addomotd.c + +m_wallops.o: m_wallops.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_wallops.c + +m_admin.o: m_admin.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_admin.c + +m_globops.o: m_globops.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_globops.c + +m_locops.o: m_locops.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_locops.c + +m_chatops.o: m_chatops.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_chatops.c + +m_trace.o: m_trace.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_trace.c + +m_netinfo.o: m_netinfo.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_netinfo.c + +m_links.o: m_links.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_links.c + +m_help.o: m_help.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_help.c + +m_rules.o: m_rules.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_rules.c + +m_close.o: m_close.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_close.c + +m_map.o: m_map.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_map.c + +m_eos.o: m_eos.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_eos.c + +m_server.o: m_server.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_server.c + +m_stats.o: m_stats.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_stats.c + +m_svsfline.o: m_svsfline.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_svsfline.c + +m_dccdeny.o: m_dccdeny.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_dccdeny.c + +m_undccdeny.o: m_undccdeny.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_undccdeny.c + +m_whowas.o: m_whowas.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_whowas.c + +m_connect.o: m_connect.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_connect.c + +m_dccallow.o: m_dccallow.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_dccallow.c + +m_userip.o: m_userip.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_userip.c + +############################################################################# +# .so's section +############################################################################# + m_adminchat.so: m_adminchat.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ -o m_adminchat.so m_adminchat.c @@ -435,6 +718,13 @@ m_dccallow.so: m_dccallow.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ -o m_dccallow.so m_dccallow.c +m_userip.so: m_userip.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -c m_userip.c + +############################################################################# +# and now the remaining modules... +############################################################################# + cloak.so: cloak.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ -o cloak.so cloak.c @@ -445,3 +735,5 @@ oldcloak.so: oldcloak.c $(INCLUDES) clean: $(RM) -f *.o *.so *~ core + + diff --git a/src/modules/cloak.c b/src/modules/cloak.c index 683470a6f..cd462c197 100644 --- a/src/modules/cloak.c +++ b/src/modules/cloak.c @@ -107,6 +107,12 @@ DLLFUNC int MOD_LOAD(cloak)(int module_load) DLLFUNC int MOD_UNLOAD(cloak)(int module_unload) { + if (cloak_key1) + { + MyFree(cloak_key1); + MyFree(cloak_key2); + MyFree(cloak_key3); + } return MOD_SUCCESS; } diff --git a/src/modules/l_commands.c b/src/modules/l_commands.c index 228246271..9cc537bc3 100644 --- a/src/modules/l_commands.c +++ b/src/modules/l_commands.c @@ -88,7 +88,7 @@ extern int m_lag_Init(ModuleInfo *modinfo), m_rping_Init(ModuleInfo *modinfo), m extern int m_tsctl_Init(ModuleInfo *modinfo), m_htm_Init(ModuleInfo *modinfo), m_chgname_Init(ModuleInfo *modinfo); extern int m_message_Init(ModuleInfo *modinfo), m_whois_Init(ModuleInfo *modinfo), m_quit_Init(ModuleInfo *modinfo); extern int m_kill_Init(ModuleInfo *modinfo), m_pingpong_Init(ModuleInfo *modinfo), m_oper_Init(ModuleInfo *modinfo); -extern int m_akill_Init(ModuleInfo *modinfo), m_rakill_Init(ModuleInfo *modinfo); +extern int m_akill_Init(ModuleInfo *modinfo), m_rakill_Init(ModuleInfo *modinfo), m_userip_Init(ModuleInfo *modinfo); extern int m_unzline_Init(ModuleInfo *modinfo), m_unkline_Init(ModuleInfo *modinfo); extern int m_sqline_Init(ModuleInfo *modinfo), m_unsqline_Init(ModuleInfo *modinfo), m_tkl_Init(ModuleInfo *modinfo); extern int m_vhost_Init(ModuleInfo *modinfo), m_cycle_Init(ModuleInfo *modinfo), m_svsjoin_Init(ModuleInfo *modinfo); @@ -130,7 +130,7 @@ extern int m_lag_Load(int module_load), m_rping_Load(int module_load), m_sendumo extern int m_tsctl_Load(int module_load), m_htm_Load(int module_load), m_chgname_Load(int module_load); extern int m_message_Load(int module_load), m_whois_Load(int module_load), m_quit_Load(int module_load); extern int m_kill_Load(int module_load), m_pingpong_Load(int module_load), m_oper_Load(int module_load); -extern int m_akill_Load(int module_load), m_rakill_Load(int module_load); +extern int m_akill_Load(int module_load), m_rakill_Load(int module_load), m_userip_Load(int unused); extern int m_unzline_Load(int module_load), m_unkline_Load(int module_load); extern int m_sqline_Load(int module_load), m_unsqline_Load(int module_load), m_tkl_Load(int module_load); extern int m_vhost_Load(int module_load), m_cycle_Load(int module_load), m_svsjoin_Load(int module_load); @@ -170,7 +170,7 @@ extern int m_adminchat_Unload(), m_nachat_Unload(), m_lag_Unload(), m_rping_Unlo extern int m_sendumode_Unload(), m_tsctl_Unload(), m_htm_Unload(), m_chgname_Unload(); extern int m_message_Unload(), m_whois_Unload(), m_quit_Unload(), m_kill_Unload(); extern int m_pingpong_Unload(), m_oper_Unload(), m_akill_Unload(), m_rakill_Unload(); -extern int m_unzline_Unload(), m_unkline_Unload(); +extern int m_unzline_Unload(), m_unkline_Unload(), m_userip_Unload(); extern int m_sqline_Unload(), m_unsqline_Unload(), m_tkl_Unload(), m_vhost_Unload(); extern int m_cycle_Unload(), m_svsjoin_Unload(), m_svspart_Unload(), m_svslusers_Unload(); extern int m_svswatch_Unload(), m_svssilence_Unload(), m_svskill_Unload(); @@ -310,6 +310,7 @@ int l_commands_Init(ModuleInfo *modinfo) m_whowas_Init(ModCmdsInfo); m_connect_Init(ModCmdsInfo); m_dccallow_Init(ModCmdsInfo); + m_userip_Init(ModCmdsInfo); #ifdef GUEST m_guest_Init(ModCmdsInfo); #endif @@ -410,6 +411,7 @@ int l_commands_Load(int module_load) m_whowas_Load(module_load); m_connect_Load(module_load); m_dccallow_Load(module_load); + m_userip_Load(module_load); #ifdef GUEST m_guest_Load(module_load); #endif @@ -510,6 +512,7 @@ int l_commands_Unload(int module_unload) m_whowas_Unload(); m_connect_Unload(); m_dccallow_Unload(); + m_userip_Unload(); #ifdef GUEST m_guest_Unload(); #endif diff --git a/src/modules/m_away.c b/src/modules/m_away.c index f1b5b5b73..c2d874dbf 100644 --- a/src/modules/m_away.c +++ b/src/modules/m_away.c @@ -97,8 +97,10 @@ DLLFUNC int MOD_UNLOAD(m_away)(int module_unload) ** parv[0] = sender prefix ** parv[1] = away message */ -int m_away(aClient *cptr, aClient *sptr, int parc, char *parv[]) { - char *away, *awy2 = parv[1]; +int m_away(aClient *cptr, aClient *sptr, int parc, char *parv[]) +{ +char *away, *awy2 = parv[1]; +int n; if (IsServer(sptr)) return 0; @@ -120,6 +122,10 @@ int m_away(aClient *cptr, aClient *sptr, int parc, char *parv[]) { return 0; } + n = dospamfilter(sptr, parv[1], SPAMF_AWAY, NULL); + if (n < 0) + return n; + #ifdef NO_FLOOD_AWAY if (MyClient(sptr) && AWAY_PERIOD && !IsAnOper(sptr)) { diff --git a/src/modules/m_dccallow.c b/src/modules/m_dccallow.c index 2ff341bd0..b50cc3a39 100644 --- a/src/modules/m_dccallow.c +++ b/src/modules/m_dccallow.c @@ -47,7 +47,6 @@ DLLFUNC int m_dccallow(aClient *cptr, aClient *sptr, int parc, char *parv[]); #define MSG_DCCALLOW "DCCALLOW" -#define TOK_DCCALLOW "" ModuleHeader MOD_HEADER(m_dccallow) = { @@ -60,7 +59,7 @@ ModuleHeader MOD_HEADER(m_dccallow) DLLFUNC int MOD_INIT(m_dccallow)(ModuleInfo *modinfo) { - add_Command(MSG_DCCALLOW, TOK_DCCALLOW, m_dccallow, 1); + CommandAdd(modinfo->handle, MSG_DCCALLOW, NULL, m_dccallow, 1, M_USER|M_ANNOUNCE); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; } @@ -72,11 +71,6 @@ DLLFUNC int MOD_LOAD(m_dccallow)(int module_load) DLLFUNC int MOD_UNLOAD(m_dccallow)(int module_unload) { - if (del_Command(MSG_DCCALLOW, TOK_DCCALLOW, m_dccallow) < 0) - { - sendto_realops("Failed to delete commands when unloading %s", - MOD_HEADER(m_dccallow).name); - } return MOD_SUCCESS; } diff --git a/src/modules/m_kick.c b/src/modules/m_kick.c index 424f4a6fb..11e252a05 100644 --- a/src/modules/m_kick.c +++ b/src/modules/m_kick.c @@ -293,6 +293,8 @@ CMD_FUNC(m_kick) if (breakit) continue; RunHook5(HOOKTYPE_LOCAL_KICK, cptr,sptr,who,chptr,comment); + } else { + RunHook5(HOOKTYPE_REMOTE_KICK, cptr, sptr, who, chptr, comment); } if (lp) { diff --git a/src/modules/m_knock.c b/src/modules/m_knock.c index 167b26d54..c7f5f5726 100644 --- a/src/modules/m_knock.c +++ b/src/modules/m_knock.c @@ -60,7 +60,7 @@ ModuleHeader MOD_HEADER(m_knock) DLLFUNC int MOD_INIT(m_knock)(ModuleInfo *modinfo) { - add_Command(MSG_KNOCK, TOK_KNOCK, m_knock, 2); + CommandAdd(modinfo->handle, MSG_KNOCK, TOK_KNOCK, m_knock, 2, M_USER|M_ANNOUNCE); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; } @@ -72,11 +72,6 @@ DLLFUNC int MOD_LOAD(m_knock)(int module_load) DLLFUNC int MOD_UNLOAD(m_knock)(int module_unload) { - if (del_Command(MSG_KNOCK, TOK_KNOCK, m_knock) < 0) - { - sendto_realops("Failed to delete commands when unloading %s", - MOD_HEADER(m_knock).name); - } return MOD_SUCCESS; } diff --git a/src/modules/m_map.c b/src/modules/m_map.c index f388e7eab..faae76e03 100644 --- a/src/modules/m_map.c +++ b/src/modules/m_map.c @@ -60,7 +60,7 @@ ModuleHeader MOD_HEADER(m_map) DLLFUNC int MOD_INIT(m_map)(ModuleInfo *modinfo) { - add_Command(MSG_MAP, TOK_MAP, m_map, MAXPARA); + CommandAdd(modinfo->handle, MSG_MAP, TOK_MAP, m_map, MAXPARA, M_USER|M_ANNOUNCE); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; } @@ -72,11 +72,6 @@ DLLFUNC int MOD_LOAD(m_map)(int module_load) DLLFUNC int MOD_UNLOAD(m_map)(int module_unload) { - if (del_Command(MSG_MAP, TOK_MAP, m_map) < 0) - { - sendto_realops("Failed to delete commands when unloading %s", - MOD_HEADER(m_map).name); - } return MOD_SUCCESS; } diff --git a/src/modules/m_message.c b/src/modules/m_message.c index 72273f919..73c797d6c 100644 --- a/src/modules/m_message.c +++ b/src/modules/m_message.c @@ -270,13 +270,13 @@ DLLFUNC int m_message(aClient *cptr, aClient *sptr, int parc, char *parv[], int if (MyClient(sptr)) { - ret = dospamfilter(sptr, text, newcmd == MSG_NOTICE ? SPAMF_USERNOTICE : SPAMF_USERMSG, acptr->name); + ret = dospamfilter(sptr, text, (notice ? SPAMF_USERNOTICE : SPAMF_USERMSG), acptr->name); if (ret < 0) return FLUSH_BUFFER; } for (tmphook = Hooks[HOOKTYPE_USERMSG]; tmphook; tmphook = tmphook->next) { - text = (*(tmphook->func.pcharfunc))(cptr, sptr, acptr, text, (int)(newcmd == MSG_NOTICE ? 1 : 0) ); + text = (*(tmphook->func.pcharfunc))(cptr, sptr, acptr, text, notice); if (!text) break; } @@ -373,6 +373,9 @@ DLLFUNC int m_message(aClient *cptr, aClient *sptr, int parc, char *parv[], int abort(); strlcpy(pfixchan+1, p2, sizeof(pfixchan)-1); nick = pfixchan; + } else { + strlcpy(pfixchan, p2, sizeof(pfixchan)); + nick = pfixchan; } } diff --git a/src/modules/m_oper.c b/src/modules/m_oper.c index 1756fb646..8bbc8e9ac 100644 --- a/src/modules/m_oper.c +++ b/src/modules/m_oper.c @@ -252,7 +252,10 @@ DLLFUNC int m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]) { /* new oper code */ - sptr->umodes |= OPER_MODES; + if (aconf->modes) + sptr->umodes |= aconf->modes; + else + sptr->umodes |= OPER_MODES; /* handle oflags that trigger umodes */ @@ -270,7 +273,19 @@ DLLFUNC int m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]) { sptr->oflag = aconf->oflags; if ((aconf->oflags & OFLAG_HIDE) && iNAH && !BadPtr(host)) { - iNAH_host(sptr, host); + char *c; + char *vhost = host; + + if ((c = strchr(host, '@'))) + { + vhost = c+1; + strncpy(sptr->user->username, host, c-host); + sptr->user->username[c-host] = 0; + sendto_serv_butone_token(NULL, sptr->name, MSG_SETIDENT, + TOK_SETIDENT, "%s", + sptr->user->username); + } + iNAH_host(sptr, vhost); SetHidden(sptr); } else if (IsHidden(sptr) && !sptr->user->virthost) { @@ -292,15 +307,14 @@ DLLFUNC int m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]) { if (announce != NULL) { - sendto_ops - ("%s (%s@%s) [%s] %s", + sendto_snomask(SNO_OPER, + "%s (%s@%s) [%s] %s", parv[0], sptr->user->username, GetHost(sptr), parv[1], announce); - sendto_serv_butone(&me, - ":%s GLOBOPS :%s (%s@%s) [%s] %s", - me.name, parv[0], sptr->user->username, - GetHost(sptr), parv[1], announce); - + sendto_serv_butone_token(NULL, me.name, MSG_SENDSNO, TOK_SENDSNO, + "o :%s (%s@%s) [%s] %s", + parv[0], sptr->user->username, + GetHost(sptr), parv[1], announce); } if (aconf->snomask) set_snomask(sptr, aconf->snomask); diff --git a/src/modules/m_sapart.c b/src/modules/m_sapart.c index 7d5bdcc8e..557468210 100644 --- a/src/modules/m_sapart.c +++ b/src/modules/m_sapart.c @@ -60,7 +60,7 @@ ModuleHeader MOD_HEADER(m_sapart) DLLFUNC int MOD_INIT(m_sapart)(ModuleInfo *modinfo) { - add_Command(MSG_SAPART, TOK_SAPART, m_sapart, MAXPARA); + add_Command(MSG_SAPART, TOK_SAPART, m_sapart, 3); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; } @@ -87,10 +87,13 @@ DLLFUNC int MOD_UNLOAD(m_sapart)(int module_unload) parv[0] - sender parv[1] - nick to make part parv[2] - channel(s) to part + parv[3] - comment */ DLLFUNC CMD_FUNC(m_sapart) { aClient *acptr; + char *comment = (parc > 3 && parv[3] ? parv[3] : NULL); + char commentx[512]; if (!IsSAdmin(sptr) && !IsULine(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); @@ -108,28 +111,51 @@ DLLFUNC CMD_FUNC(m_sapart) sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], parv[1]); return 0; } - - sendto_realops("%s used SAPART to make %s part %s", sptr->name, parv[1], - parv[2]); - - - /* Logging function added by XeRXeS */ - ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s", - sptr->name, parv[1], parv[2]); + + if (comment) + { + sendto_realops("%s used SAPART to make %s part %s (%s)", sptr->name, parv[1], + parv[2], comment); + /* Logging function added by XeRXeS */ + ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s (%s)", + sptr->name, parv[1], parv[2], comment); + strcpy(commentx, "SAPart: "); + strlcat(commentx, comment, 512); + } + else + { + sendto_realops("%s used SAPART to make %s part %s", sptr->name, parv[1], + parv[2]); + /* Logging function added by XeRXeS */ + ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s", + sptr->name, parv[1], parv[2]); + } if (MyClient(acptr)) { parv[0] = parv[1]; parv[1] = parv[2]; - parv[2] = NULL; - sendto_one(acptr, - ":%s %s %s :*** You were forced to part %s", me.name, - IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name, parv[1]); - (void)m_part(acptr, acptr, 2, parv); + parv[2] = comment ? commentx : NULL; + if (comment) + sendto_one(acptr, + ":%s %s %s :*** You were forced to part %s (%s)", me.name, + IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name, parv[1], + commentx); + else + sendto_one(acptr, + ":%s %s %s :*** You were forced to part %s", me.name, + IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name, parv[1]); + (void)m_part(acptr, acptr, comment ? 3 : 2, parv); } else - sendto_one(acptr, ":%s SAPART %s %s", parv[0], - parv[1], parv[2]); + { + if (comment) + sendto_one(acptr, ":%s SAPART %s %s :%s", parv[0], + parv[1], parv[2], comment); + else + sendto_one(acptr, ":%s SAPART %s %s", parv[0], parv[1], + parv[2]); + } return 0; } diff --git a/src/modules/m_sjoin.c b/src/modules/m_sjoin.c index 9aafd01d5..48df6bec6 100644 --- a/src/modules/m_sjoin.c +++ b/src/modules/m_sjoin.c @@ -379,7 +379,7 @@ CMD_FUNC(m_sjoin) while ( (*tp == '@') || (*tp == '+') || (*tp == '%') || (*tp == '*') || (*tp == '~') || (*tp == '&') - || (*tp == '"')) + || (*tp == '"') || (*tp == '\'')) { switch (*(tp++)) { @@ -405,6 +405,8 @@ CMD_FUNC(m_sjoin) modeflags |= CHFL_EXCEPT; goto getnick; break; + case '\'': /* future: invex chanmode (+I) */ + goto docontinue; } } getnick: @@ -472,6 +474,7 @@ CMD_FUNC(m_sjoin) #endif } else { add_user_to_channel(chptr, acptr, modeflags); + RunHook4(HOOKTYPE_REMOTE_JOIN, cptr, acptr, chptr, NULL); if (chptr->mode.mode & MODE_AUDITORIUM) { if (modeflags & (CHFL_CHANOP|CHFL_CHANPROT|CHFL_CHANOWNER)) @@ -517,6 +520,8 @@ CMD_FUNC(m_sjoin) } } } +docontinue: + continue; } if (modebuf[1]) diff --git a/src/modules/m_svsjoin.c b/src/modules/m_svsjoin.c index 5361868f1..c0c11895a 100644 --- a/src/modules/m_svsjoin.c +++ b/src/modules/m_svsjoin.c @@ -47,7 +47,7 @@ DLLFUNC int m_svsjoin(aClient *cptr, aClient *sptr, int parc, char *parv[]); /* Place includes here */ #define MSG_SVSJOIN "SVSJOIN" -#define TOK_SVSJOIN "BR" +#define TOK_SVSJOIN "BX" ModuleHeader MOD_HEADER(m_svsjoin) = { diff --git a/src/modules/m_svso.c b/src/modules/m_svso.c index 7d1ce1e33..d63fb9d41 100644 --- a/src/modules/m_svso.c +++ b/src/modules/m_svso.c @@ -174,7 +174,7 @@ int m_svso(aClient *cptr, aClient *sptr, int parc, char *parv[]) acptr->umodes &= ~(UMODE_NETADMIN | UMODE_WHOIS); acptr->umodes &= - ~(UMODE_KIX | UMODE_DEAF | UMODE_HIDEOPER); + ~(UMODE_KIX | UMODE_DEAF | UMODE_HIDEOPER | UMODE_VICTIM); acptr->oflag = 0; remove_oper_snomasks(acptr); RunHook2(HOOKTYPE_LOCAL_OPER, acptr, 0); diff --git a/src/modules/m_svspart.c b/src/modules/m_svspart.c index 8ba7d7fe1..1c77f93bd 100644 --- a/src/modules/m_svspart.c +++ b/src/modules/m_svspart.c @@ -64,7 +64,7 @@ DLLFUNC int MOD_INIT(m_svspart)(ModuleInfo *modinfo) /* * We call our add_Command crap here */ - add_Command(MSG_SVSPART, TOK_SVSPART, m_svspart, MAXPARA); + add_Command(MSG_SVSPART, TOK_SVSPART, m_svspart, 3); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; } @@ -92,10 +92,12 @@ DLLFUNC int MOD_UNLOAD(m_svspart)(int module_unload) parv[0] - sender parv[1] - nick to make part parv[2] - channel(s) to part + parv[3] - comment */ CMD_FUNC(m_svspart) { aClient *acptr; + char *comment = (parc > 3 && parv[3] ? parv[3] : NULL); if (!IsULine(sptr)) return 0; @@ -105,11 +107,18 @@ CMD_FUNC(m_svspart) { parv[0] = parv[1]; parv[1] = parv[2]; - (void)m_part(acptr, acptr, 2, parv); + parv[2] = comment; + (void)m_part(acptr, acptr, comment ? 3 : 2, parv); } else - sendto_one(acptr, ":%s SVSPART %s %s", parv[0], - parv[1], parv[2]); + { + if (comment) + sendto_one(acptr, ":%s SVSPART %s %s :%s", parv[0], + parv[1], parv[2], parv[3]); + else + sendto_one(acptr, ":%s SVSPART %s %s", parv[0], + parv[1], parv[2]); + } return 0; } diff --git a/src/modules/m_svswatch.c b/src/modules/m_svswatch.c index c8fc58d53..06ee8b98b 100644 --- a/src/modules/m_svswatch.c +++ b/src/modules/m_svswatch.c @@ -47,7 +47,7 @@ DLLFUNC int m_svswatch(aClient *cptr, aClient *sptr, int parc, char *parv[]); /* Place includes here */ #define MSG_SVSWATCH "SVSWATCH" -#define TOK_SVSWATCH "BW" +#define TOK_SVSWATCH "Bw" ModuleHeader MOD_HEADER(m_svswatch) = { diff --git a/src/modules/m_userip.c b/src/modules/m_userip.c new file mode 100644 index 000000000..36f1f8a50 --- /dev/null +++ b/src/modules/m_userip.c @@ -0,0 +1,140 @@ +/* + * IRC - Internet Relay Chat, src/modules/m_userip.c + * (C) 2004 The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include "config.h" +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include "msg.h" +#include "proto.h" +#include "channel.h" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include "h.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif + +DLLFUNC int m_userip(aClient *cptr, aClient *sptr, int parc, char *parv[]); + +#define MSG_USERIP "USERIP" + +ModuleHeader MOD_HEADER(m_userip) + = { + "m_userip", + "$Id$", + "command /userip", + "3.2-b8-1", + NULL + }; + +DLLFUNC int MOD_INIT(m_userip)(ModuleInfo *modinfo) +{ + CommandAdd(modinfo->handle, MSG_USERIP, NULL, m_userip, 1, M_USER|M_ANNOUNCE); + MARK_AS_OFFICIAL_MODULE(modinfo); + return MOD_SUCCESS; +} + +DLLFUNC int MOD_LOAD(m_userip)(int module_load) +{ + return MOD_SUCCESS; +} + +DLLFUNC int MOD_UNLOAD(m_userip)(int module_unload) +{ + return MOD_SUCCESS; +} + +/* + * m_userip is based on m_userhost + * m_userhost added by Darren Reed 13/8/91 to aid clients and reduce + * the need for complicated requests like WHOIS. It returns user/host + * information only (no spurious AWAY labels or channels). + * Re-written by Dianora 1999 + */ +DLLFUNC CMD_FUNC(m_userip) +{ + + char *p; /* scratch end pointer */ + char *cn; /* current name */ + char *ip; + struct Client *acptr; + char response[5][NICKLEN * 2 + CHANNELLEN + USERLEN + HOSTLEN + 30]; + int i; /* loop counter */ + + if (parc < 2) + { + sendto_one(sptr, rpl_str(ERR_NEEDMOREPARAMS), + me.name, parv[0], "USERHOST"); + return 0; + } + + /* The idea is to build up the response string out of pieces + * none of this strlen() nonsense. + * 5 * (NICKLEN*2+CHANNELLEN+USERLEN+HOSTLEN+30) is still << sizeof(buf) + * and our ircsprintf() truncates it to fit anyway. There is + * no danger of an overflow here. -Dianora + */ + response[0][0] = response[1][0] = response[2][0] = + response[3][0] = response[4][0] = '\0'; + + cn = parv[1]; + + for (i = 0; (i < 5) && cn; i++) + { + if ((p = strchr(cn, ' '))) + *p = '\0'; + + if ((acptr = find_person(cn, NULL))) + { + if (!(ip = GetIP(acptr))) + ip = ""; + if (sptr != acptr && !IsOper(sptr) && IsHidden(acptr)) + ip = RCallbacks[CALLBACKTYPE_CLOAK]->func.pcharfunc(ip); + + ircsprintf(response[i], "%s%s=%c%s@%s", + acptr->name, + (IsAnOper(acptr) && (!IsHideOper(acptr) || sptr == acptr || IsAnOper(sptr))) + ? "*" : "", + (acptr->user->away) ? '-' : '+', + acptr->user->username, ip); + } + if (p) + p++; + cn = p; + } + + sendto_one(sptr, rpl_str(RPL_USERIP), me.name, parv[0], + response[0], response[1], response[2], response[3], response[4]); + + return 0; +} diff --git a/src/modules/m_vhost.c b/src/modules/m_vhost.c index 1a6075fcc..320ad5d43 100644 --- a/src/modules/m_vhost.c +++ b/src/modules/m_vhost.c @@ -175,12 +175,14 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (vhost->virtuser) { strcpy(olduser, sptr->user->username); strlcpy(sptr->user->username, vhost->virtuser, USERLEN); + sendto_serv_butone_token(cptr, sptr->name, MSG_SETIDENT, TOK_SETIDENT, + "%s", sptr->user->username); } sptr->umodes |= UMODE_HIDE; sptr->umodes |= UMODE_SETHOST; sendto_serv_butone_token(cptr, sptr->name, MSG_SETHOST, TOK_SETHOST, - "%s", vhost->virthost); + "%s", sptr->user->virthost); sendto_one(sptr, ":%s MODE %s :+tx", sptr->name, sptr->name); if (vhost->swhois) { diff --git a/src/modules/m_who.c b/src/modules/m_who.c index 30b8764d8..3704620d3 100644 --- a/src/modules/m_who.c +++ b/src/modules/m_who.c @@ -204,15 +204,15 @@ static void who_sendhelp(aClient *sptr) "Flag a: user is away", "Flag c : user is on ,", " no wildcards accepted", - "Flag h : user has string in their hostname,", + "Flag h : user has string in his/her hostname,", " wildcards accepted", - "Flag m : user has set on them,", - " only O/o/C/A/a/N are allowed", - "Flag n : user has string in their nickname,", + "Flag m : user has set, only", + " O/o/C/A/a/N are allowed", + "Flag n : user has string in his/her nickname,", " wildcards accepted", "Flag s : user is on server ,", " wildcards not accepted", - "Flag u : user has string in their username,", + "Flag u : user has string in his/her username,", " wildcards accepted", "Behavior flags:", "Flag M: check for user in channels I am a member of", @@ -227,23 +227,23 @@ static void who_sendhelp(aClient *sptr) "Flag a: user is away", "Flag c : user is on ,", " no wildcards accepted", - "Flag g : user has string in their GCOS,", + "Flag g : user has string in his/her GCOS,", " wildcards accepted", - "Flag h : user has string in their hostname,", + "Flag h : user has string in his/her hostname,", " wildcards accepted", - "Flag i : user has string in their hostname,", + "Flag i : user has string in his/her IP address,", " wildcards accepted", - "Flag m : user has set on them", - "Flag n : user has string in their nickname,", + "Flag m : user has set", + "Flag n : user has string in his/her nickname,", " wildcards accepted", "Flag s : user is on server ,", " wildcards not accepted", - "Flag u : user has string in their username,", + "Flag u : user has string in his/her username,", " wildcards accepted", "Behavior flags:", "Flag M: check for user in channels I am a member of", "Flag R: show users' real hostnames", - "Flag I: show user's IP address", + "Flag I: show users' IP addresses", NULL }; char **s; @@ -544,10 +544,16 @@ char has_common_chan = 0; else { /* a user/mask who */ + + /* If the common channel info hasn't been set, set it now */ + if (!wfl.common_channels_only) + has_common_chan = has_common_channels(sptr, acptr); + if (IsInvisible(acptr) && !has_common_chan) { - /* don't show them unless it's an exact match */ - if ((who_flags & WF_WILDCARD)) + /* don't show them unless it's an exact match + or it is the user requesting the /who */ + if ((who_flags & WF_WILDCARD) && sptr != acptr) break; } } diff --git a/src/modules/m_whois.c b/src/modules/m_whois.c index c889427b3..5edf8878a 100644 --- a/src/modules/m_whois.c +++ b/src/modules/m_whois.c @@ -175,12 +175,15 @@ DLLFUNC int m_whois(aClient *cptr, aClient *sptr, int parc, char *parv[]) IsHidden(acptr) ? user->virthost : user->realhost, acptr->info); - if (IsEyes(sptr) && IsOper(sptr)) + if (IsOper(sptr)) { + char sno[512]; + strcpy(sno, get_sno_str(acptr)); + /* send the target user's modes */ sendto_one(sptr, rpl_str(RPL_WHOISMODES), me.name, parv[0], name, - get_mode_str(acptr)); + get_mode_str(acptr), sno[1] == 0 ? "" : sno); } if ((acptr == sptr) || IsAnOper(sptr)) { @@ -238,18 +241,15 @@ DLLFUNC int m_whois(aClient *cptr, aClient *sptr, int parc, char *parv[]) && IsAnOper(sptr)) *(buf + len++) = '!'; access = get_access(acptr, chptr); -#ifndef PREFIX_AQ - if (access & CHFL_CHANOWNER) - *(buf + len++) = '*'; - else if (access & CHFL_CHANPROT) - *(buf + len++) = '^'; -#else +#ifdef PREFIX_AQ if (access & CHFL_CHANOWNER) *(buf + len++) = '~'; else if (access & CHFL_CHANPROT) + *(buf + len++) = '&'; + else #endif - else if (access & CHFL_CHANOP) + if (access & CHFL_CHANOP) *(buf + len++) = '@'; else if (access & CHFL_HALFOP) *(buf + len++) = '%'; diff --git a/src/packet.c b/src/packet.c index d80724428..0917ecc07 100644 --- a/src/packet.c +++ b/src/packet.c @@ -289,85 +289,6 @@ aCommand *add_Command_backend(char *cmd, int (*func)(), unsigned char parameters return newcmd; } -int CommandExists(char *name) -{ - aCommand *p; - - for (p = CommandHash[toupper(*name)]; p; p = p->next) - { - if (!stricmp(p->cmd, name)) - return 1; - } - for (p = TokenHash[*name]; p; p = p->next) - { - if (!strcmp(p->cmd, name)) - return 1; - } - return 0; -} - -Command *CommandAdd(Module *module, char *cmd, char *tok, int (*func)(), unsigned char params, int flags) { - Command *command; - - if (find_Command_simple(cmd) || (tok && find_Command_simple(tok))) - { - if (module) - module->errorcode = MODERR_EXISTS; - return NULL; - } - command = MyMallocEx(sizeof(Command)); - command->cmd = add_Command_backend(cmd,func,params, 0, flags); - command->tok = NULL; - command->cmd->owner = module; - if (tok) { - command->tok = add_Command_backend(tok,func,params,1,flags); - command->cmd->friend = command->tok; - command->tok->friend = command->cmd; - command->tok->owner = module; - } - else - command->cmd->friend = NULL; - if (module) { - ModuleObject *cmdobj = (ModuleObject *)MyMallocEx(sizeof(ModuleObject)); - cmdobj->object.command = command; - cmdobj->type = MOBJ_COMMAND; - AddListItem(cmdobj, module->objects); - module->errorcode = MODERR_NOERROR; - } - return command; -} - - -void CommandDel(Command *command) { - Cmdoverride *ovr, *ovrnext; - - DelListItem(command->cmd, CommandHash[toupper(*command->cmd->cmd)]); - if (command->tok) - DelListItem(command->tok, TokenHash[*command->tok->cmd]); - if (command->cmd->owner) { - ModuleObject *cmdobj; - for (cmdobj = command->cmd->owner->objects; cmdobj; cmdobj = (ModuleObject *)cmdobj->next) { - if (cmdobj->type == MOBJ_COMMAND && cmdobj->object.command == command) { - DelListItem(cmdobj,command->cmd->owner->objects); - MyFree(cmdobj); - break; - } - } - } - for (ovr = command->cmd->overriders; ovr; ovr = ovrnext) - { - ovrnext = ovr->next; - CmdoverrideDel(ovr); - } - MyFree(command->cmd->cmd); - MyFree(command->cmd); - if (command->tok) { - MyFree(command->tok->cmd); - MyFree(command->tok); - } - MyFree(command); -} - void add_Command(char *name, char *token, int (*func)(), unsigned char parameters) { aCommand *cmd, *tok; diff --git a/src/res.c b/src/res.c index a8699348f..7348836ed 100644 --- a/src/res.c +++ b/src/res.c @@ -51,6 +51,9 @@ static ResRQ *last, *first; static void rem_cache(aCache *); static void rem_request(ResRQ *); static int do_query_name(Link *, char *, ResRQ *); +/* revquery is used when looking up IP -> name -> IP to differentiate between + * IPv6 and IPv4, to make the proper request type --slePP */ +static int do_revquery_name(Link *, char *, ResRQ *, int is_ipv6_address); static int do_query_number(Link *, struct IN_ADDR *, ResRQ *); static void resend_query(ResRQ *); static int proc_answer(ResRQ *, HEADER *, char *, char *); @@ -127,13 +130,23 @@ int init_resolver(int op) if (op & RES_INITSOCK) { int on = 0; - + struct sockaddr_in sa; /* TODO: IPv6 */ + #ifdef INET6 /* still IPv4 */ ret = resfd = socket(AF_INET, SOCK_DGRAM, 0); #else ret = resfd = socket(AF_INET, SOCK_DGRAM, 0); #endif + + /* TODO: IPv6 */ + /* for FreeBSD jail we need to bind() explicitly.. */ + bzero(&sa, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = 0; + sa.sin_addr.s_addr = INADDR_ANY; + bind(resfd, (struct sockaddr *) &sa, sizeof(sa)); + (void)setsockopt(ret, SOL_SOCKET, SO_BROADCAST, &on, on); } #ifdef DEBUGMODE @@ -304,6 +317,19 @@ void del_queries(char *cp) } } +void del_async_connects(void) +{ +ResRQ *rptr, *r2ptr; + + for (rptr = first; rptr; rptr = r2ptr) + { + r2ptr = rptr->next; + if (rptr->cinfo.flags == ASYNC_CONNECT) + rem_request(rptr); + } +} + + /* * sends msg to all nameservers found in the "ircd_res" structure. * This should reflect /etc/resolv.conf. We will get responses @@ -399,6 +425,7 @@ static ResRQ *find_id(int id) return rptr; } +/* As of 2004-10-08 gethost_byname() is only used for outgoing connects to servers */ struct hostent *gethost_byname(char *name, Link *lp) { aCache *cp; @@ -412,6 +439,20 @@ struct hostent *gethost_byname(char *name, Link *lp) return NULL; } +/* This is identical to gethost_byname, except it includes is_ipv6_address + * See do_revquery_name() */ +struct hostent *gethost_byname_revquery(char *name, Link *lp, int is_ipv6_address) +{ + aCache *cp; + reinfo.re_na_look++; + if ((cp = find_cache_name(name))) + return (struct hostent *)&(cp->he); + if (!lp) + return NULL; + (void)do_revquery_name(lp, name, NULL, is_ipv6_address); + return NULL; +} + struct hostent *gethost_byaddr(char *addr, Link *lp) { aCache *cp; @@ -425,20 +466,19 @@ struct hostent *gethost_byaddr(char *addr, Link *lp) return NULL; } +/* [2004-10-08/Syzop] used for outgoing connects to servers and + * also for repeated normal requests (in which case rptr is non-NULL). + */ static int do_query_name(Link *lp, char *name, ResRQ *rptr) { - char hname[HOSTLEN + 1]; - int len; +char hname[HOSTLEN + 1]; - strncpyzt(hname, name, sizeof(hname)); - len = strlen(hname); + strlcpy(hname, name, sizeof(hname)); if (rptr && !index(hname, '.') && ircd_res.options & RES_DEFNAMES) { - (void)strncat(hname, dot, sizeof(hname) - len - 1); - len++; - (void)strncat(hname, ircd_res.defdname, - sizeof(hname) - len - 1); + strlcat(hname, dot, sizeof(hname)); + strlcat(hname, ircd_res.defdname, sizeof(hname)); } /* @@ -449,19 +489,57 @@ static int do_query_name(Link *lp, char *name, ResRQ *rptr) { rptr = make_request(lp); #ifdef INET6 - rptr->type = T_ANY; /* Was T_AAAA: now using T_ANY so we fetch both A and AAAA -- Syzop */ + rptr->type = T_AAAA; /* outgoing connect: try AAAA first, then A later */ #else rptr->type = T_A; #endif - rptr->name = (char *)MyMalloc(strlen(name) + 1); - (void)strcpy(rptr->name, name); + rptr->name = strdup(name); } Debug((DEBUG_DNS, "do_query_name(): %s ", hname)); -#ifdef INET6 - return (query_name(hname, C_IN, T_ANY, rptr)); /* Was T_AAAA: now using T_ANY so we fetch both A and AAAA -- Syzop */ -#else - return (query_name(hname, C_IN, T_A, rptr)); -#endif + + /* We used 'type' here instead of 'rptr->type', but I don't see + * any reason not to use the latter. -- Syzop, 2004-10-08 + */ + return (query_name(hname, C_IN, rptr->type, rptr)); +} + +/* If is_ipv6_address is set, look for AAAA records, if not, + * go looking for A records. This fixes a bug when talking to + * servers that do not provide any non-authoritative information + * to an ANY query (ie. dnscache). --slePP */ +static int do_revquery_name(Link *lp, char *name, ResRQ *rptr, int is_ipv6_address) +{ +char hname[HOSTLEN + 1]; + + Debug((DEBUG_DNS, "do_revquery_name: looking for %s", (is_ipv6_address?"IPv6":"IPv4"))); + + strncpyzt(hname, name, sizeof(hname)); + + if (rptr && !index(hname, '.') && ircd_res.options & RES_DEFNAMES) + { + strlcat(hname, dot, sizeof(hname)); + strlcat(hname, ircd_res.defdname, sizeof(hname)); + } + + /* + * Store the name passed as the one to lookup and generate other host + * names to pass onto the nameserver(s) for lookups. + */ + if (!rptr) + { + rptr = make_request(lp); + if(is_ipv6_address) + rptr->type = T_AAAA; + else + rptr->type = T_A; + rptr->name = strdup(name); + } + Debug((DEBUG_DNS, "do_revquery_name(): %s ", hname)); + + if(is_ipv6_address) + return (query_name(hname, C_IN, T_AAAA, rptr)); + else + return (query_name(hname, C_IN, T_A, rptr)); } /* @@ -554,6 +632,7 @@ static int query_name(char *name, int class, int type, ResRQ *rptr) return r; } hptr = (HEADER *) buf; + hptr->rd = 1; do { hptr->id = htons(getrandom16()); @@ -900,6 +979,7 @@ struct hostent *get_res(char *lp) if (a > 0 && rptr->type == T_PTR) { struct hostent *hp2 = NULL; + int is_ipv6_address = 0; if (BadPtr(rptr->he.h_name)) /* Kludge! 960907/Vesa */ goto getres_err; @@ -913,7 +993,11 @@ struct hostent *get_res(char *lp) * type we automatically gain the use of the cache with no * extra kludges. */ - if ((hp2 = gethost_byname(rptr->he.h_name, &rptr->cinfo))) + /* We add this IPv6 check to query for T_AAAA or T_A respectively. + * djbdns/dnscache doesn't return A or AAAA to a T_ANY (as it should) + * --slePP */ + is_ipv6_address = (strchr(Inet_ia2p((struct IN_ADDR *)&rptr->he.h_addr), ':') != NULL); + if ((hp2 = gethost_byname_revquery(rptr->he.h_name, &rptr->cinfo, is_ipv6_address))) if (lp) bcopy((char *)&rptr->cinfo, lp, sizeof(Link)); /* diff --git a/src/res_init.c b/src/res_init.c index 24a4936e3..974d30869 100644 --- a/src/res_init.c +++ b/src/res_init.c @@ -272,6 +272,7 @@ int get_res_interfaces_nt(HKEY hKey, char *subkey, char *obuf, int *size) int idx = 0; FILETIME lastwrite; HKEY hVal; + while (RegEnumKeyEx(hKey, idx++, buf, &key_len, 0, NULL, NULL, &lastwrite) != ERROR_NO_MORE_ITEMS) { if (RegOpenKeyEx(hKey, buf, 0, KEY_QUERY_VALUE, &hVal) != ERROR_SUCCESS) @@ -303,6 +304,8 @@ void get_res_from_reg_nt() HKEY hKey, hInter; char buf[BUFSIZ]; int key_len = BUFSIZ; + char no_interfaces = 0; + ircd_res.nscount = 0; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", @@ -311,7 +314,9 @@ void get_res_from_reg_nt() Debug((DEBUG_DNS, "Error: get_res_from_reg_nt: unable to open registry key")); return; } - RegOpenKeyEx(hKey, "Interfaces", 0, KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &hInter); + if (RegOpenKeyEx(hKey, "Interfaces", 0, KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, + &hInter) != ERROR_SUCCESS) + no_interfaces = 1; /* Retreive the Domain key */ if (!get_res_nt(hKey, "Domain", buf, &key_len)) @@ -324,7 +329,7 @@ void get_res_from_reg_nt() if (!get_res_interfaces_nt(hInter, "Domain", buf, &key_len)) { key_len = BUFSIZ; - if (!get_res_interfaces_nt(hInter, "DhcpDomain", buf, &key_len)) + if (!no_interfaces && !get_res_interfaces_nt(hInter, "DhcpDomain", buf, &key_len)) { Debug((DEBUG_DNS, "get_res_from_reg_nt: RegQueryValueEx: Domain failed")); } @@ -343,7 +348,7 @@ void get_res_from_reg_nt() if (!get_res_nt(hKey, "DhcpSearchList", buf, &key_len)) { key_len = BUFSIZ; - if (!get_res_interfaces_nt(hInter, "SearchList", buf, &key_len)) + if (!no_interfaces && !get_res_interfaces_nt(hInter, "SearchList", buf, &key_len)) { key_len = BUFSIZ; if (!get_res_interfaces_nt(hInter, "DhcpSearchList", buf, &key_len)) @@ -380,8 +385,7 @@ void get_res_from_reg_nt() ++cp; *cp = 0; *pp++ = 0; - } - + } /* Retreive the NameServer key */ key_len = BUFSIZ; if (!get_res_nt(hKey, "NameServer", buf, &key_len)) @@ -391,7 +395,7 @@ void get_res_from_reg_nt() if (!get_res_nt(hKey, "DhcpNameServer", buf, &key_len)) { key_len = BUFSIZ; - if (!get_res_interfaces_nt(hInter, "NameServer", buf, &key_len)) + if (!no_interfaces && !get_res_interfaces_nt(hInter, "NameServer", buf, &key_len)) { key_len = BUFSIZ; if (!get_res_interfaces_nt(hInter, "DhcpNameServer", buf, &key_len)) @@ -429,7 +433,8 @@ void get_res_from_reg_nt() } while (ircd_res.nscount <= MAXNS); } } - RegCloseKey(hInter); + if (!no_interfaces) + RegCloseKey(hInter); RegCloseKey(hKey); } #endif diff --git a/src/s_bsd.c b/src/s_bsd.c index e626de052..456abec49 100644 --- a/src/s_bsd.c +++ b/src/s_bsd.c @@ -2366,7 +2366,7 @@ int connect_server(ConfigItem_link *aconf, aClient *by, struct hostent *hp) * If we dont know the IP# for this host and itis a hostname and * not a ip# string, then try and find the appropriate host record. */ - if ((!aconf->ipnum.S_ADDR)) + if (!WHOSTENTP(aconf->ipnum.S_ADDR)) { Link lin; @@ -2530,8 +2530,9 @@ static struct SOCKADDR *connect_inet(ConfigItem_link *aconf, aClient *cptr, int * being present instead. If we dont know it, then the connect fails. */ #ifdef INET6 - if (!inet_pton(AF_INET6, aconf->hostname, aconf->ipnum.s6_addr)) - bcopy(minus_one, aconf->ipnum.s6_addr, IN6ADDRSZ); + if (!WHOSTENTP(aconf->ipnum.S_ADDR) && + !inet_pton(AF_INET6, aconf->hostname, aconf->ipnum.s6_addr)) + bcopy(minus_one, aconf->ipnum.s6_addr, IN6ADDRSZ); /* IP->struct failed: make invalid */ if (AND16(aconf->ipnum.s6_addr) == 255) #else if (isdigit(*aconf->hostname) && (aconf->ipnum.S_ADDR == -1)) diff --git a/src/s_conf.c b/src/s_conf.c index b409345b7..ef61d19a3 100644 --- a/src/s_conf.c +++ b/src/s_conf.c @@ -23,6 +23,7 @@ #include "sys.h" #include "numeric.h" #include "channel.h" +#include "macros.h" #include #ifndef _WIN32 #include @@ -132,10 +133,6 @@ static int _test_set (ConfigFile *conf, ConfigEntry *ce); static int _test_badword (ConfigFile *conf, ConfigEntry *ce); #endif static int _test_deny (ConfigFile *conf, ConfigEntry *ce); -/* static int _test_deny_dcc (ConfigFile *conf, ConfigEntry *ce); ** TODO? */ -/* static int _test_deny_link (ConfigFile *conf, ConfigEntry *ce); ** TODO? */ -/* static int _test_deny_channel (ConfigFile *conf, ConfigEntry *ce); ** TODO? */ -/* static int _test_deny_version (ConfigFile *conf, ConfigEntry *ce); ** TODO? */ static int _test_allow_channel (ConfigFile *conf, ConfigEntry *ce); static int _test_allow_dcc (ConfigFile *conf, ConfigEntry *ce); static int _test_loadmodule (ConfigFile *conf, ConfigEntry *ce); @@ -278,6 +275,15 @@ static OperFlag _LogFlags[] = { { LOG_TKL, "tkl" }, }; +/* This MUST be alphabetized */ +static OperFlag ExceptTklFlags[] = { + { TKL_GLOBAL|TKL_KILL, "gline" }, + { TKL_GLOBAL|TKL_NICK, "gqline" }, + { TKL_GLOBAL|TKL_ZAP, "gzline" }, + { TKL_NICK, "qline" }, + { TKL_GLOBAL|TKL_SHUN, "shun" } +}; + #ifdef USE_SSL /* This MUST be alphabetized */ static OperFlag _SSLFlags[] = { @@ -1362,7 +1368,7 @@ void config_progress(char *format, ...) ConfigCommand *config_binary_search(char *cmd) { int start = 0; - int stop = sizeof(_ConfigCommands)/sizeof(_ConfigCommands[0])-1; + int stop = ARRAY_SIZEOF(_ConfigCommands)-1; int mid; while (start <= stop) { mid = (start+stop)/2; @@ -1532,6 +1538,7 @@ int init_conf(char *rootconf, int rehash) if (rehash) { Hook *h; + del_async_connects(); config_rehash(); #ifndef STATIC_LINKING Unload_all_loaded_modules(); @@ -2879,6 +2886,8 @@ int _test_me(ConfigFile *conf, ConfigEntry *ce) if (cep->ce_vardata) { + int valid = 0; + char *p; if (strlen(cep->ce_vardata) > (REALLEN-1)) { config_error("%s:%i: too long me::info, must be max. %i characters", @@ -2886,6 +2895,19 @@ int _test_me(ConfigFile *conf, ConfigEntry *ce) errors++; } + /* Valid me::info? Any data except spaces is ok */ + for (p=cep->ce_vardata; *p; p++) + if (*p != ' ') + { + valid = 1; + break; + } + if (!valid) + { + config_error("%s:%i: empty me::info, should be a server description.", + ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + errors++; + } } } if (!(cep = config_find_entry(ce->ce_entries, "numeric"))) @@ -3008,7 +3030,7 @@ int _conf_oper(ConfigFile *conf, ConfigEntry *ce) { for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if ((ofp = config_binary_flags_search(_OperFlags, cepp->ce_varname, sizeof(_OperFlags)/sizeof(_OperFlags[0])))) + if ((ofp = config_binary_flags_search(_OperFlags, cepp->ce_varname, ARRAY_SIZEOF(_OperFlags)))) oper->oflags |= ofp->flag; } } @@ -3020,6 +3042,10 @@ int _conf_oper(ConfigFile *conf, ConfigEntry *ce) { ircstrdup(oper->snomask, cep->ce_vardata); } + if ((cep = config_find_entry(ce->ce_entries, "modes"))) + { + oper->modes = set_usermode(cep->ce_vardata); + } if ((cep = config_find_entry(ce->ce_entries, "maxlogins"))) { oper->maxlogins = (int)config_checkval(cep->ce_vardata, CFG_TIME); @@ -3083,6 +3109,8 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce) } else if (!strcmp(cep->ce_varname, "snomask")) { } + else if (!strcmp(cep->ce_varname, "modes")) { + } else if (!strcmp(cep->ce_varname, "maxlogins")) { long l = config_checkval(cep->ce_vardata, CFG_TIME); @@ -3118,7 +3146,7 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce) errors++; continue; } - if (!config_binary_flags_search(_OperFlags, cepp->ce_varname, sizeof(_OperFlags)/sizeof(_OperFlags[0]))) { + if (!config_binary_flags_search(_OperFlags, cepp->ce_varname, ARRAY_SIZEOF(_OperFlags))) { if (!strcmp(cepp->ce_varname, "can_stealth")) { config_status("%s:%i: unknown oper flag '%s' [feature no longer exists]", @@ -3685,7 +3713,7 @@ int _conf_listen(ConfigFile *conf, ConfigEntry *ce) { for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if ((ofp = config_binary_flags_search(_ListenerFlags, cepp->ce_varname, sizeof(_ListenerFlags)/sizeof(_ListenerFlags[0])))) + if ((ofp = config_binary_flags_search(_ListenerFlags, cepp->ce_varname, ARRAY_SIZEOF(_ListenerFlags)))) tmpflags |= ofp->flag; } #ifndef USE_SSL @@ -3830,7 +3858,7 @@ int _test_listen(ConfigFile *conf, ConfigEntry *ce) cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); errors++; continue; } - if (!config_binary_flags_search(_ListenerFlags, cepp->ce_varname, sizeof(_ListenerFlags)/sizeof(_ListenerFlags[0]))) + if (!config_binary_flags_search(_ListenerFlags, cepp->ce_varname, ARRAY_SIZEOF(_ListenerFlags))) { config_error("%s:%i: unknown listen option '%s'", cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, @@ -4250,6 +4278,30 @@ int errors = 0, gotfilename=0; return errors; } +void create_tkl_except(char *mask, char *type) +{ + ConfigItem_except *ca; + struct irc_netmask tmp; + OperFlag *opf; + ca = MyMallocEx(sizeof(ConfigItem_except)); + ca->mask = strdup(mask); + + opf = config_binary_flags_search(ExceptTklFlags, type, ARRAY_SIZEOF(ExceptTklFlags)); + ca->type = opf->flag; + + if (ca->type & TKL_KILL || ca->type & TKL_ZAP || ca->type & TKL_SHUN) + { + tmp.type = parse_netmask(ca->mask, &tmp); + if (tmp.type != HM_HOST) + { + ca->netmask = MyMallocEx(sizeof(struct irc_netmask)); + bcopy(&tmp, ca->netmask, sizeof(struct irc_netmask)); + } + } + ca->flag.type = CONF_EXCEPT_TKL; + AddListItem(ca, conf_except); +} + int _conf_except(ConfigFile *conf, ConfigEntry *ce) { @@ -4302,32 +4354,14 @@ int _conf_except(ConfigFile *conf, ConfigEntry *ce) else if (!strcmp(ce->ce_vardata, "tkl")) { cep2 = config_find_entry(ce->ce_entries, "mask"); cep3 = config_find_entry(ce->ce_entries, "type"); - ca = MyMallocEx(sizeof(ConfigItem_except)); - ca->mask = strdup(cep2->ce_vardata); - if (!strcmp(cep3->ce_vardata, "gline")) - ca->type = TKL_KILL|TKL_GLOBAL; - else if (!strcmp(cep3->ce_vardata, "qline")) - ca->type = TKL_NICK; - else if (!strcmp(cep3->ce_vardata, "gqline")) - ca->type = TKL_NICK|TKL_GLOBAL; - else if (!strcmp(cep3->ce_vardata, "gzline")) - ca->type = TKL_ZAP|TKL_GLOBAL; - else if (!strcmp(cep3->ce_vardata, "shun")) - ca->type = TKL_SHUN|TKL_GLOBAL; - else - {} - - if (ca->type & TKL_KILL || ca->type & TKL_ZAP || ca->type & TKL_SHUN) + if (cep3->ce_vardata) + create_tkl_except(cep2->ce_vardata, cep3->ce_vardata); + else { - tmp.type = parse_netmask(ca->mask, &tmp); - if (tmp.type != HM_HOST) - { - ca->netmask = MyMallocEx(sizeof(struct irc_netmask)); - bcopy(&tmp, ca->netmask, sizeof(struct irc_netmask)); - } + ConfigEntry *cepp; + for (cepp = cep3->ce_entries; cepp; cepp = cepp->ce_next) + create_tkl_except(cep2->ce_vardata, cepp->ce_varname); } - ca->flag.type = CONF_EXCEPT_TKL; - AddListItem(ca, conf_except); } else { int value; @@ -4416,31 +4450,84 @@ int _test_except(ConfigFile *conf, ConfigEntry *ce) } #endif else if (!strcmp(ce->ce_vardata, "tkl")) { - if (!config_find_entry(ce->ce_entries, "mask")) - { - config_error("%s:%i: except tkl without mask item", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - return 1; - } - if (!(cep3 = config_find_entry(ce->ce_entries, "type"))) - { - config_error("%s:%i: except tkl without type item", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - return 1; - } + char has_mask = 0, has_type = 0; + for (cep = ce->ce_entries; cep; cep = cep->ce_next) { - if (!cep->ce_vardata) - { - config_error("%s:%i: except tkl item without contents", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); - errors++; - continue; - } if (!strcmp(cep->ce_varname, "mask")) { + if (!cep->ce_vardata) + { + config_error("%s:%i: except tkl item without contents", + cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + errors++; + continue; + } + has_mask = 1; + } + else if (!strcmp(cep->ce_varname, "type")) + { + if (cep->ce_vardata) + { + OperFlag *opf; + if (!strcmp(cep->ce_vardata, "tkline") || + !strcmp(cep->ce_vardata, "tzline")) + { + config_error("%s:%i: except tkl of type %s is" + " deprecated. Use except ban {}" + " instead", + cep->ce_fileptr->cf_filename, + cep->ce_varlinenum, + cep->ce_vardata); + errors++; + } + if (!config_binary_flags_search(ExceptTklFlags, + cep->ce_vardata, ARRAY_SIZEOF(ExceptTklFlags))) + { + config_error("%s:%i: unknown except tkl type %s", + cep->ce_fileptr->cf_filename, + cep->ce_varlinenum, + cep->ce_vardata); + return 1; + } + } + else if (cep->ce_entries) + { + ConfigEntry *cepp; + for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + { + OperFlag *opf; + if (!strcmp(cepp->ce_varname, "tkline") || + !strcmp(cepp->ce_varname, "tzline")) + { + config_error("%s:%i: except tkl of type %s is" + " deprecated. Use except ban {}" + " instead", + cepp->ce_fileptr->cf_filename, + cepp->ce_varlinenum, + cepp->ce_varname); + errors++; + } + if (!config_binary_flags_search(ExceptTklFlags, + cepp->ce_varname, ARRAY_SIZEOF(ExceptTklFlags))) + { + config_error("%s:%i: unknown except tkl type %s", + cepp->ce_fileptr->cf_filename, + cepp->ce_varlinenum, + cepp->ce_varname); + return 1; + } + } + } + else + { + config_error("%s:%i: except tkl item without contents", + cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + errors++; + continue; + } + has_type = 1; } - else if (!strcmp(cep->ce_varname, "type")) {} else { config_error("%s:%i: unknown except tkl directive %s", @@ -4449,28 +4536,17 @@ int _test_except(ConfigFile *conf, ConfigEntry *ce) continue; } } - if (!strcmp(cep3->ce_vardata, "gline")) {} - else if (!strcmp(cep3->ce_vardata, "qline")) {} - else if (!strcmp(cep3->ce_vardata, "gqline")) {} - else if (!strcmp(cep3->ce_vardata, "gzline")){} - else if (!strcmp(cep3->ce_vardata, "shun")) {} - else if (!strcmp(cep3->ce_vardata, "tkline")) { - config_error("%s:%i: except tkl of type tkline is deprecated. Use except ban {} instead", - cep3->ce_fileptr->cf_filename, cep3->ce_varlinenum); - errors++; - } - else if (!strcmp(cep3->ce_vardata, "tzline")) { - config_error("%s:%i: except tkl of type tzline is deprecated. Use except ban {} instead", - cep3->ce_fileptr->cf_filename, cep3->ce_varlinenum); - errors++; - } - else + if (!has_mask) { - config_error("%s:%i: unknown except tkl type %s", - cep3->ce_fileptr->cf_filename, cep3->ce_varlinenum, - cep3->ce_vardata); + config_error("%s:%i: except tkl without mask item", + ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + return 1; + } + if (!has_type) + { + config_error("%s:%i: except tkl without type item", + ce->ce_fileptr->cf_filename, ce->ce_varlinenum); return 1; - } return errors; } @@ -4890,7 +4966,7 @@ int _test_badword(ConfigFile *conf, ConfigEntry *ce) { } else { - char *errbuf = unreal_checkregex(word->ce_vardata,1,0); + char *errbuf = unreal_checkregex(word->ce_vardata,1,1); if (errbuf) { config_error("%s:%i: badword::%s contains an invalid regex: %s", @@ -5185,7 +5261,7 @@ int _conf_log(ConfigFile *conf, ConfigEntry *ce) else if (!strcmp(cep->ce_varname, "flags")) { for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if ((ofp = config_binary_flags_search(_LogFlags, cepp->ce_varname, sizeof(_LogFlags)/sizeof(_LogFlags[0])))) + if ((ofp = config_binary_flags_search(_LogFlags, cepp->ce_varname, ARRAY_SIZEOF(_LogFlags)))) ca->flags |= ofp->flag; } } @@ -5258,7 +5334,7 @@ int _test_log(ConfigFile *conf, ConfigEntry *ce) { cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); errors++; continue; } - if (!config_binary_flags_search(_LogFlags, cepp->ce_varname, sizeof(_LogFlags)/sizeof(_LogFlags[0]))) { + if (!config_binary_flags_search(_LogFlags, cepp->ce_varname, ARRAY_SIZEOF(_LogFlags))) { config_error("%s:%i: unknown log flag '%s'", cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname); @@ -5313,7 +5389,7 @@ int _conf_link(ConfigFile *conf, ConfigEntry *ce) cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); continue; } - if ((ofp = config_binary_flags_search(_LinkFlags, cepp->ce_varname, sizeof(_LinkFlags)/sizeof(_LinkFlags[0])))) + if ((ofp = config_binary_flags_search(_LinkFlags, cepp->ce_varname, ARRAY_SIZEOF(_LinkFlags)))) link->options |= ofp->flag; } @@ -5465,7 +5541,7 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) errors++; continue; } - if (!(ofp = config_binary_flags_search(_LinkFlags, cepp->ce_varname, sizeof(_LinkFlags)/sizeof(_LinkFlags[0])))) { + if (!(ofp = config_binary_flags_search(_LinkFlags, cepp->ce_varname, ARRAY_SIZEOF(_LinkFlags)))) { config_error("%s:%i: unknown link option '%s'", cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname); @@ -5728,6 +5804,8 @@ int _conf_set(ConfigFile *conf, ConfigEntry *ce) } else if (!strcmp(cep->ce_varname, "silence-limit")) { tempiConf.silence_limit = atol(cep->ce_vardata); + if (loop.ircd_booted) + IsupportSetValue(IsupportFind("SILENCE"), cep->ce_vardata); } else if (!strcmp(cep->ce_varname, "auto-join")) { ircstrdup(tempiConf.auto_join_chans, cep->ce_vardata); @@ -5795,6 +5873,13 @@ int _conf_set(ConfigFile *conf, ConfigEntry *ce) } else if (!strcmp(cep->ce_varname, "maxchannelsperuser")) { tempiConf.maxchannelsperuser = atoi(cep->ce_vardata); + if (loop.ircd_booted) + { + char tmpbuf[512]; + IsupportSetValue(IsupportFind("MAXCHANNELS"), cep->ce_vardata); + ircsprintf(tmpbuf, "#:%s", cep->ce_vardata); + IsupportSetValue(IsupportFind("CHANLIMIT"), tmpbuf); + } } else if (!strcmp(cep->ce_varname, "maxdccallow")) { tempiConf.maxdccallow = atoi(cep->ce_vardata); @@ -5807,6 +5892,8 @@ int _conf_set(ConfigFile *conf, ConfigEntry *ce) *cep->ce_vardata='-'; } ircstrdup(tempiConf.network.x_ircnet005, tmp); + if (loop.ircd_booted) + IsupportSetValue(IsupportFind("NETWORK"), tmp); cep->ce_vardata = tmp; } else if (!strcmp(cep->ce_varname, "default-server")) { @@ -6489,6 +6576,7 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) else if (!strcmp(cep->ce_varname, "hosts")) { for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { + char *c, *host; if (!cepp->ce_vardata) { config_error("%s:%i: set::hosts item without value", @@ -6526,6 +6614,60 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) continue; } + if ((c = strchr(cepp->ce_vardata, '@'))) + { + char *tmp; + if (!(*(c+1)) || (c-cepp->ce_vardata) > USERLEN || + c == cepp->ce_vardata) + { + config_error("%s:%i: illegal value for set::hosts::%s", + cepp->ce_fileptr->cf_filename, + cepp->ce_varlinenum, + cepp->ce_varname); + errors++; + continue; + } + for (tmp = cepp->ce_vardata; tmp != c; tmp++) + { + if (*tmp == '~' && tmp == cepp->ce_vardata) + continue; + if (!isallowed(*tmp)) + break; + } + if (tmp != c) + { + config_error("%s:%i: illegal value for set::hosts::%s", + cepp->ce_fileptr->cf_filename, + cepp->ce_varlinenum, + cepp->ce_varname); + errors++; + continue; + } + host = c+1; + } + else + host = cepp->ce_vardata; + if (strlen(host) > HOSTLEN) + { + config_error("%s:%i: illegal value for set::hosts::%s", + cepp->ce_fileptr->cf_filename, + cepp->ce_varlinenum, + cepp->ce_varname); + errors++; + continue; + } + for (; *host; host++) + { + if (!isallowed(*host) && *host != ':') + { + config_error("%s:%i: illegal value for set::hosts::%s", + cepp->ce_fileptr->cf_filename, + cepp->ce_varlinenum, + cepp->ce_varname); + errors++; + continue; + } + } } } else if (!strcmp(cep->ce_varname, "cloak-keys")) @@ -6778,7 +6920,7 @@ int _conf_loadmodule(ConfigFile *conf, ConfigEntry *ce) *(cSlash+1)=0; } hFind = FindFirstFile(ce->ce_vardata, &FindData); - if (!FindData.cFileName) { + if (!FindData.cFileName || hFind == INVALID_HANDLE_VALUE) { config_status("%s:%i: loadmodule %s: failed to load", ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); @@ -6793,7 +6935,7 @@ int _conf_loadmodule(ConfigFile *conf, ConfigEntry *ce) if ((ret = Module_Create(path))) { config_status("%s:%i: loadmodule %s: failed to load: %s", ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - FindData.cFileName, ret); + path, ret); free(path); return -1; } @@ -6987,7 +7129,8 @@ int _conf_alias(ConfigFile *conf, ConfigEntry *ce) ircstrdup(format->format, cep->ce_vardata); regcomp(&format->expr, cep->ce_vardata, REG_ICASE|REG_EXTENDED); for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if (!strcmp(cepp->ce_varname, "nick")) { + if (!strcmp(cepp->ce_varname, "nick") || + !strcmp(cepp->ce_varname, "target")) { ircstrdup(format->nick, cepp->ce_vardata); } else if (!strcmp(cepp->ce_varname, "parameters")) { @@ -7000,12 +7143,15 @@ int _conf_alias(ConfigFile *conf, ConfigEntry *ce) format->type = ALIAS_STATS; else if (!strcmp(cepp->ce_vardata, "normal")) format->type = ALIAS_NORMAL; + else if (!strcmp(cepp->ce_vardata, "channel")) + format->type = ALIAS_CHANNEL; } } AddListItem(format, alias->format); } - else if (!strcmp(cep->ce_varname, "nick")) { + else if (!strcmp(cep->ce_varname, "nick") || !strcmp(cep->ce_varname, "target")) + { ircstrdup(alias->nick, cep->ce_vardata); } else if (!strcmp(cep->ce_varname, "type")) { @@ -7015,6 +7161,8 @@ int _conf_alias(ConfigFile *conf, ConfigEntry *ce) alias->type = ALIAS_STATS; else if (!strcmp(cep->ce_vardata, "normal")) alias->type = ALIAS_NORMAL; + else if (!strcmp(cep->ce_vardata, "channel")) + alias->type = ALIAS_CHANNEL; else if (!strcmp(cep->ce_vardata, "command")) alias->type = ALIAS_COMMAND; } @@ -7096,9 +7244,9 @@ int _test_alias(ConfigFile *conf, ConfigEntry *ce) { cep->ce_varlinenum); errors++; } - if (!config_find_entry(cep->ce_entries, "nick")) + if (!config_find_entry(cep->ce_entries, "nick") && !config_find_entry(cep->ce_entries, "target")) { - config_error("%s:%i: alias::format::nick missing", cep->ce_fileptr->cf_filename, + config_error("%s:%i: alias::format::target missing", cep->ce_fileptr->cf_filename, cep->ce_varlinenum); errors++; } @@ -7111,7 +7259,8 @@ int _test_alias(ConfigFile *conf, ConfigEntry *ce) { cepp->ce_varname); errors++; continue; } - if (!strcmp(cepp->ce_varname, "nick")) + if (!strcmp(cepp->ce_varname, "nick") || + !strcmp(cepp->ce_varname, "target")) ; else if (!strcmp(cepp->ce_varname, "type")) { @@ -7121,6 +7270,8 @@ int _test_alias(ConfigFile *conf, ConfigEntry *ce) { ; else if (!strcmp(cepp->ce_vardata, "normal")) ; + else if (!strcmp(cepp->ce_vardata, "channel")) + ; else { config_status("%s:%i: unknown alias type", cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); @@ -7136,7 +7287,7 @@ int _test_alias(ConfigFile *conf, ConfigEntry *ce) { } } } - else if (!strcmp(cep->ce_varname, "nick")) + else if (!strcmp(cep->ce_varname, "nick") || !strcmp(cep->ce_varname, "target")) ; else if (!strcmp(cep->ce_varname, "type")) { if (!strcmp(cep->ce_vardata, "services")) @@ -7145,6 +7296,8 @@ int _test_alias(ConfigFile *conf, ConfigEntry *ce) { ; else if (!strcmp(cep->ce_vardata, "normal")) ; + else if (!strcmp(cep->ce_vardata, "channel")) + ; else if (!strcmp(cep->ce_vardata, "command")) ; else { diff --git a/src/s_err.c b/src/s_err.c index 97ece99c7..bb0ee2421 100644 --- a/src/s_err.c +++ b/src/s_err.c @@ -34,7 +34,7 @@ static char *replies[] = { /* 002 RPL_YOURHOST */ ":%s 002 %s :Your host is %s, running version %s", /* 003 RPL_CREATED */ ":%s 003 %s :This server was created %s", /* 004 RPL_MYINFO */ ":%s 004 %s %s %s %s %s", -/* 005 RPL_PROTOCTL */ ":%s 005 %s", +/* 005 RPL_ISUPPORT */ ":%s 005 %s %s :are supported by this server", /* 006 RPL_MAP */ ":%s 006 %s :%s%-*s(%d) %s", /* 007 RPL_MAPEND */ ":%s 007 %s :End of /MAP", /* 008 RPL_SNOMASK */ ":%s 008 %s :Server notice mask (%s)", @@ -134,7 +134,7 @@ static char *replies[] = { /* 102 */ NULL, /* 103 */ NULL, /* 104 */ NULL, -/* 105 RPL_REMOTEPROTOCTL */ ":%s 105 %s", +/* 105 RPL_REMOTEISUPPORT */ ":%s 105 %s %s :are supported by this server", /* 106 */ NULL, /* 107 */ NULL, /* 108 */ NULL, @@ -377,7 +377,7 @@ static char *replies[] = { /* 337 */ NULL, /* 338 */ NULL, /* ircu, bahamut */ /* 339 */ NULL, /* Used */ -/* 340 */ NULL, /* ircu */ +/* 340 RPL_USERIP */ ":%s 340 %s :%s %s %s %s %s", /* 341 RPL_INVITING */ ":%s 341 %s %s %s", /* 342 RPL_SUMMONING */ ":%s 342 %s %s :User summoned to irc", /* 343 */ NULL, @@ -416,7 +416,7 @@ static char *replies[] = { /* 376 RPL_ENDOFMOTD */ ":%s 376 %s :End of /MOTD command.", /* 377 */ NULL, /* aircd, austhex */ /* 378 RPL_WHOISHOST */ ":%s 378 %s %s :is connecting from *@%s %s", -/* 379 RPL_WHOISMODES */ ":%s 379 %s %s :is using modes %s", +/* 379 RPL_WHOISMODES */ ":%s 379 %s %s :is using modes %s %s", /* 380 */ NULL, /* aircd, austhex */ /* 381 RPL_YOUREOPER */ ":%s 381 %s :You are now an IRC Operator", /* 382 RPL_REHASHING */ ":%s 382 %s %s :Rehashing", diff --git a/src/s_kline.c b/src/s_kline.c index a2b7aa1c6..13151a8d5 100644 --- a/src/s_kline.c +++ b/src/s_kline.c @@ -154,6 +154,10 @@ aTKline *tkl_add_line(int type, char *usermask, char *hostmask, char *reason, ch nl->ptr.spamf->tkl_duration = spamf_tkl_duration; nl->ptr.spamf->tkl_reason = strdup(spamf_tkl_reason); /* already encoded */ } + if (nl->subtype & SPAMF_USER) + loop.do_bancheck_spamf_user = 1; + if (nl->subtype & SPAMF_AWAY) + loop.do_bancheck_spamf_away = 1; } else if (type & TKL_KILL || type & TKL_ZAP || type & TKL_SHUN) { @@ -420,7 +424,7 @@ int find_tkline_match(aClient *cptr, int xx) if (excepts->netmask) { - if (match_ip(cptr->ip, NULL, NULL, excepts->netmask)) + if (match_ip(cptr->ip, host2, excepts->mask, excepts->netmask)) return 1; } else if (!match(excepts->mask, host) || !match(excepts->mask, host2)) @@ -552,6 +556,24 @@ int find_shun(aClient *cptr) return 2; } +/** Checks if the user matches a spamfilter of type 'u' (user, + * nick!user@host:realname ban). + * Written by: Syzop + * Assumes: only call for clients, possible assume on local clients [?] + * Return values: see dospamfilter() + */ +int find_spamfilter_user(aClient *sptr) +{ +char spamfilter_user[NICKLEN + USERLEN + HOSTLEN + REALLEN + 64]; /* n!u@h:r */ + + if (IsAnOper(sptr)) + return 0; + + ircsprintf(spamfilter_user, "%s!%s@%s:%s", + sptr->name, sptr->user->username, sptr->user->realhost, sptr->info); + return dospamfilter(sptr, spamfilter_user, SPAMF_USER, NULL); +} + aTKline *find_qline(aClient *cptr, char *nick, int *ishold) { aTKline *lp; @@ -586,7 +608,7 @@ aTKline *find_qline(aClient *cptr, char *nick, int *ishold) return lp; } - chost = cptr->sockhost; + chost = cptr->user ? cptr->user->realhost : (MyConnect(cptr) ? cptr->sockhost : "unknown"); cname = cptr->user ? cptr->user->username : "unknown"; strcpy(host, make_user_host(cname, chost)); @@ -603,7 +625,7 @@ aTKline *find_qline(aClient *cptr, char *nick, int *ishold) continue; if (excepts->netmask) { - if (match_ip(cptr->ip, NULL, NULL, excepts->netmask)) + if (MyConnect(cptr) && match_ip(cptr->ip, NULL, NULL, excepts->netmask)) return NULL; } else if (!match(excepts->mask, host) || (host2 && !match(excepts->mask, host2))) @@ -1060,7 +1082,8 @@ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[]) parv[1], parv[2], parv[3], parv[4], tk->setby, tk->expire_at, tk->set_at, tk->ptr.spamf->tkl_duration, tk->ptr.spamf->tkl_reason, tk->reason); - } else + } + else if (type & TKL_GLOBAL) sendto_serv_butone(cptr, ":%s TKL %s %s %s %s %s %ld %ld :%s", sptr->name, parv[1], parv[2], parv[3], parv[4], @@ -1441,9 +1464,17 @@ int dospamfilter(aClient *sptr, char *str_in, int type, char *target) { aTKline *tk; int n; -char *str = (char *)StripControlCodes(str_in); +char *str; - if (!IsPerson(sptr) || IsAnOper(sptr) || IsULine(sptr)) + if (type == SPAMF_USER) + str = str_in; + else + str = (char *)StripControlCodes(str_in); + + /* (note: using sptr->user check here instead of IsPerson() + * due to SPAMF_USER where user isn't marked as client/person yet. + */ + if (!sptr->user || IsAnOper(sptr) || IsULine(sptr)) return 0; for (tk = tklines[tkl_hash('F')]; tk; tk = tk->next) @@ -1494,6 +1525,16 @@ char *str = (char *)StripControlCodes(str_in); sendnotice(sptr, "DCC to %s blocked: %s", target, unreal_decodespace(tk->ptr.spamf->tkl_reason)); break; + case SPAMF_AWAY: + /* hack to deal with 'after-away-was-set-filters' */ + if (sptr->user->away && !strcmp(str_in, sptr->user->away)) + { + /* free away & broadcast the unset */ + MyFree(sptr->user->away); + sptr->user->away = NULL; + sendto_serv_butone_token(sptr, sptr->name, MSG_AWAY, TOK_AWAY, ""); + } + break; default: break; } diff --git a/src/s_misc.c b/src/s_misc.c index 4ca6ba19b..71f77cadb 100644 --- a/src/s_misc.c +++ b/src/s_misc.c @@ -597,11 +597,8 @@ int exit_client(aClient *cptr, aClient *sptr, aClient *from, char *comment) for (acptr = client; acptr; acptr = next) { next = acptr->next; - if (IsServer(acptr) && acptr->srvptr == sptr) { - exit_client(sptr, acptr, /* RECURSION */ - sptr, comment1); - RunHook(HOOKTYPE_SERVER_QUIT, acptr); - } + if (IsServer(acptr) && acptr->srvptr == sptr) + exit_client(sptr, acptr, sptr, comment1); /* RECURSION */ /* * I am not masking SQUITS like I do QUITs. This * is probobly something we could easily do, but @@ -990,6 +987,8 @@ int flags = 0; case 'P': flags |= SPAMF_PART; break; case 'q': flags |= SPAMF_QUIT; break; case 'd': flags |= SPAMF_DCC; break; + case 'u': flags |= SPAMF_USER; break; + case 'a': flags |= SPAMF_AWAY; break; default: if (sptr) { @@ -1020,6 +1019,10 @@ int flags = 0; return SPAMF_QUIT; if (!strcmp(s, "dcc")) return SPAMF_DCC; + if (!strcmp(s, "user")) + return SPAMF_USER; + if (!strcmp(s, "away")) + return SPAMF_AWAY; return 0; } @@ -1042,6 +1045,10 @@ char *p = buf; *p++ = 'q'; if (v & SPAMF_DCC) *p++ = 'd'; + if (v & SPAMF_USER) + *p++ = 'u'; + if (v & SPAMF_AWAY) + *p++ = 'a'; *p = '\0'; return buf; } @@ -1063,6 +1070,10 @@ char *spamfilter_inttostring_long(int v) return "QUIT"; case SPAMF_DCC: return "DCC"; + case SPAMF_USER: + return "user"; + case SPAMF_AWAY: + return "AWAY"; default: return "UNKNOWN"; } diff --git a/src/s_serv.c b/src/s_serv.c index 75b47288f..60297faf1 100644 --- a/src/s_serv.c +++ b/src/s_serv.c @@ -138,6 +138,8 @@ extern fdlist serv_fdlist; CMD_FUNC(m_version) { extern char serveropts[]; + extern char *IsupportStrings[]; + int reply, i; /* Only allow remote VERSIONs if registered -- Syzop */ if (!IsPerson(sptr) && !IsServer(cptr)) @@ -163,15 +165,15 @@ CMD_FUNC(m_version) if (IsAnOper(sptr)) sendto_one(sptr, ":%s NOTICE %s :%s", me.name, sptr->name, curl_version()); #endif - if (MyClient(sptr)) { + if (MyClient(sptr)) normal: - sendto_one(sptr, ":%s 005 %s " PROTOCTL_CLIENT_1, me.name, sptr->name, PROTOCTL_PARAMETERS_1); - sendto_one(sptr, ":%s 005 %s " PROTOCTL_CLIENT_2, me.name, sptr->name, PROTOCTL_PARAMETERS_2); - } - else { - sendto_one(sptr, ":%s 105 %s " PROTOCTL_CLIENT_1, me.name, sptr->name, PROTOCTL_PARAMETERS_1); - sendto_one(sptr, ":%s 105 %s " PROTOCTL_CLIENT_2, me.name, sptr->name, PROTOCTL_PARAMETERS_2); - } + reply = RPL_ISUPPORT; + else + reply = RPL_REMOTEISUPPORT; + /* Send the text */ + for (i = 0; IsupportStrings[i]; i++) + sendto_one(sptr, rpl_str(reply), me.name, sptr->name, + IsupportStrings[i]); } return 0; } @@ -437,6 +439,8 @@ CMD_FUNC(m_watch) */ if (*s == '+') { + if (!*(s+1)) + continue; if (do_nick_name(s + 1)) { if (sptr->watches >= MAXWATCH) @@ -461,6 +465,8 @@ CMD_FUNC(m_watch) */ if (*s == '-') { + if (!*(s+1)) + continue; del_from_watch_hash_table(s + 1, sptr); show_watch(sptr, s + 1, RPL_WATCHOFF, RPL_WATCHOFF); diff --git a/src/s_svs.c b/src/s_svs.c index 69b341254..6e4c70fde 100644 --- a/src/s_svs.c +++ b/src/s_svs.c @@ -220,17 +220,20 @@ void strrangetok(char *in, char *out, char tok, short first, short last) { int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { ConfigItem_alias *alias; aClient *acptr; - if (parc < 2 || *parv[1] == '\0') { + if (parc < 2 || *parv[1] == '\0') + { sendto_one(sptr, err_str(ERR_NOTEXTTOSEND), me.name, parv[0]); return -1; } - if (!(alias = Find_alias(cmd))) { + if (!(alias = Find_alias(cmd))) + { sendto_one(sptr, ":%s %d %s %s :Unknown command", me.name, ERR_UNKNOWNCOMMAND, parv[0], cmd); return 0; } - if (alias->type == ALIAS_SERVICES) { + if (alias->type == ALIAS_SERVICES) + { if (SERVICES_NAME && (acptr = find_person(alias->nick, NULL))) sendto_one(acptr, ":%s %s %s@%s :%s", parv[0], IsToken(acptr->from) ? TOK_PRIVATE : MSG_PRIVATE, @@ -239,7 +242,8 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { sendto_one(sptr, err_str(ERR_SERVICESDOWN), me.name, parv[0], alias->nick); } - else if (alias->type == ALIAS_STATS) { + else if (alias->type == ALIAS_STATS) + { if (STATS_SERVER && (acptr = find_person(alias->nick, NULL))) sendto_one(acptr, ":%s %s %s@%s :%s", parv[0], IsToken(acptr->from) ? TOK_PRIVATE : MSG_PRIVATE, @@ -248,11 +252,13 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { sendto_one(sptr, err_str(ERR_SERVICESDOWN), me.name, parv[0], alias->nick); } - else if (alias->type == ALIAS_NORMAL) { - if ((acptr = find_person(alias->nick, NULL))) { + else if (alias->type == ALIAS_NORMAL) + { + if ((acptr = find_person(alias->nick, NULL))) + { if (MyClient(acptr)) sendto_one(acptr, ":%s!%s@%s PRIVMSG %s :%s", parv[0], - sptr->user->username, IsHidden(sptr) ? sptr->user->virthost : sptr->user->realhost, + sptr->user->username, GetHost(sptr), alias->nick, parv[1]); else sendto_one(acptr, ":%s %s %s :%s", parv[0], @@ -263,11 +269,33 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], alias->nick); } - else if (alias->type == ALIAS_COMMAND) { + else if (alias->type == ALIAS_CHANNEL) + { + aChannel *chptr; + if ((chptr = find_channel(alias->nick, NULL))) + { + if (!can_send(sptr, chptr, parv[1], 0)) + { + sendto_channelprefix_butone_tok(sptr, + sptr, chptr, + PREFIX_ALL, + MSG_PRIVATE, + TOK_PRIVATE, + chptr->chname, parv[1], 0); + return 0; + } + } + sendto_one(sptr, err_str(ERR_CANNOTDOCOMMAND), me.name, parv[0], + cmd, "You may not use this command at this time"); + } + else if (alias->type == ALIAS_COMMAND) + { ConfigItem_alias_format *format; char *ptr = parv[1]; - for (format = alias->format; format; format = (ConfigItem_alias_format *)format->next) { - if (regexec(&format->expr, ptr, 0, NULL, 0) == 0) { + for (format = alias->format; format; format = (ConfigItem_alias_format *)format->next) + { + if (regexec(&format->expr, ptr, 0, NULL, 0) == 0) + { /* Parse the parameters */ int i = 0, j = 0, k = 1; char output[501]; @@ -275,13 +303,16 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { char *current = MyMalloc(strlen(parv[1])+1); bzero(current, strlen(parv[1])+1); bzero(output, sizeof output); - while(format->parameters[i] && j < 500) { + while(format->parameters[i] && j < 500) + { k = 0; - if (format->parameters[i] == '%') { + if (format->parameters[i] == '%') + { i++; if (format->parameters[i] == '%') output[j++] = '%'; - else if (isdigit(format->parameters[i])) { + else if (isdigit(format->parameters[i])) + { for(; isdigit(format->parameters[i]) && k < 2; i++, k++) { nums[k] = format->parameters[i]; } @@ -301,7 +332,14 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { j += strlen(current); } - else { + else if (format->parameters[i] == 'n' || + format->parameters[i] == 'N') + { + strlcat(output, parv[0], sizeof output); + j += strlen(parv[0]); + } + else + { output[j++] = '%'; output[j++] = format->parameters[i]; } @@ -311,7 +349,8 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { output[j++] = format->parameters[i++]; } output[j] = 0; - if (format->type == ALIAS_SERVICES) { + if (format->type == ALIAS_SERVICES) + { if (SERVICES_NAME && (acptr = find_person(format->nick, NULL))) sendto_one(acptr, ":%s %s %s@%s :%s", parv[0], IsToken(acptr->from) ? TOK_PRIVATE : MSG_PRIVATE, @@ -320,7 +359,8 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { sendto_one(sptr, err_str(ERR_SERVICESDOWN), me.name, parv[0], format->nick); } - else if (format->type == ALIAS_STATS) { + else if (format->type == ALIAS_STATS) + { if (STATS_SERVER && (acptr = find_person(format->nick, NULL))) sendto_one(acptr, ":%s %s %s@%s :%s", parv[0], IsToken(acptr->from) ? TOK_PRIVATE : MSG_PRIVATE, @@ -329,8 +369,10 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { sendto_one(sptr, err_str(ERR_SERVICESDOWN), me.name, parv[0], format->nick); } - else if (format->type == ALIAS_NORMAL) { - if ((acptr = find_person(format->nick, NULL))) { + else if (format->type == ALIAS_NORMAL) + { + if ((acptr = find_person(format->nick, NULL))) + { if (MyClient(acptr)) sendto_one(acptr, ":%s!%s@%s PRIVMSG %s :%s", parv[0], sptr->user->username, IsHidden(sptr) ? sptr->user->virthost : sptr->user->realhost, @@ -344,6 +386,25 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], format->nick); } + else if (format->type == ALIAS_CHANNEL) + { + aChannel *chptr; + if ((chptr = find_channel(alias->nick, NULL))) + { + if (!can_send(sptr, chptr, parv[1], 0)) + { + sendto_channelprefix_butone_tok(sptr, + sptr, chptr, + PREFIX_ALL, MSG_PRIVATE, + TOK_PRIVATE, chptr->chname, + parv[1], 0); + return 0; + } + } + sendto_one(sptr, err_str(ERR_CANNOTDOCOMMAND), me.name, + parv[0], cmd, + "You may not use this command at this time"); + } free(current); break; } diff --git a/src/s_user.c b/src/s_user.c index 72f1a49a3..d002036ea 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -69,6 +69,10 @@ void iNAH_host(aClient *sptr, char *host) { if (!sptr->user) return; + + if (UHOST_ALLOWED == UHALLOW_REJOIN) + rejoin_doparts(sptr); + if (sptr->user->virthost) { MyFree(sptr->user->virthost); @@ -79,6 +83,9 @@ void iNAH_host(aClient *sptr, char *host) sendto_serv_butone_token(&me, sptr->name, MSG_SETHOST, TOK_SETHOST, "%s", sptr->user->virthost); sptr->umodes |= UMODE_SETHOST; + + if (UHOST_ALLOWED == UHALLOW_REJOIN) + rejoin_dojoinandmode(sptr); } long set_usermode(char *umode) @@ -602,7 +609,12 @@ int check_for_target_limit(aClient *sptr, void *target, const char *name) ** a change should be global, some confusion would ** result if only few servers allowed it... */ -#if defined(CHINESE_NICK) || defined(JAPANESE_NICK) + +#if defined(NICK_GB2312) || defined(NICK_GBK) || defined(NICK_GBK_JAP) +#define NICK_MULTIBYTE +#endif + +#ifdef NICK_MULTIBYTE /* Chinese Nick Verification Code - Added by RexHsu on 08/09/00 (beta2) * Now Support All GBK Words,Thanks to Mr.WebBar ! * Special Char Bugs Fixed by RexHsu 09/01/00 I dont know whether it is @@ -619,34 +631,56 @@ int check_for_target_limit(aClient *sptr, void *target, const char *name) * 6. ÈÕÎÄÆ½¼ÙÃû±àÂëÇø(a4a1-a4f3) -->work correctly?maybe... * 7. ÈÕÎÄÆ¬¼ÙÃû±àÂëÇø(a5a1-a5f7) -->work correctly?maybe... * 8. º«ÎıàÂëÇø(xxxx-yyyy) + * + * isvalidChinese() rewritten by Xuefer (2004-10-10), + * this will probably be the last time we do it this way, + * in 3.2.3 we are gonna try a more generic aproach. -- Syzop */ -int isvalidChinese(const unsigned char c1, const unsigned char c2) + +int isvalidChinese(const unsigned char c1, const unsigned char c2) { - const unsigned int GBK_S = 0xb0a1; - const unsigned int GBK_E = 0xf7fe; - const unsigned int GBK_2_S = 0x8140; - const unsigned int GBK_2_E = 0xa0fe; - const unsigned int GBK_3_S = 0xaa40; - const unsigned int GBK_3_E = 0xfea0; - const unsigned int JPN_PING_S = 0xa4a1; - const unsigned int JPN_PING_E = 0xa4f3; - const unsigned int JPN_PIAN_S = 0xa5a1; - const unsigned int JPN_PIAN_E = 0xa5f7; - unsigned int AWord = c1 * 256 + c2; -#if defined(CHINESE_NICK) && defined(JAPANESE_NICK) - return (AWord >= GBK_S && AWord <= GBK_E || AWord >= GBK_2_S - && AWord <= GBK_2_E || AWord >= JPN_PING_S && AWord <= JPN_PING_E - || AWord >= JPN_PIAN_S && AWord <= JPN_PIAN_E) ? 1 : 0; + unsigned int w = (((unsigned int)c1) << 8) | c2; + +/* rang of w/c1/c2 (rw never used) */ +#define rw(s, e) (w >= ((unsigned int )s) && w <= ((unsigned int )e)) +#define r1(s, e) (c1 >= ((unsigned char)s) && c1 <= ((unsigned char)e)) +#define r2(s, e) (c2 >= ((unsigned char)s) && c2 <= ((unsigned char)e)) +#define e1(e) (c1 == (unsigned char)e) + +#ifdef NICK_GBK_JAP + /* GBK/1 */ + /* JIS_PIN part 1 */ + if (e1(0xA4) && r2(0xA1, 0xF3)) return 1; + /* JIS_PIN part 2 */ + if (e1(0xA5) && r2(0xA1, 0xF6)) return 1; #endif -#if defined(CHINESE_NICK) && !defined(JAPANESE_NICK) - return (AWord >= GBK_S && AWord <= GBK_E || AWord >= GBK_2_S - && AWord <= GBK_2_E ? 1 : 0); -#endif -#if !defined(CHINESE_NICK) && defined(JAPANESE_NICK) - return (AWord >= JPN_PING_S && AWord <= JPN_PING_E - || AWord >= JPN_PIAN_S && AWord <= JPN_PIAN_E) ? 1 : 0; +#if defined(NICK_GB2312) || defined(NICK_GBK) + /* GBK/2 BC with GB2312 */ + if (r2(0xA1, 0xFE)) + { + /* Block 16-55, ordered by Chinese Spelling(PinYin) 3755 chars */ + if (r1(0xB0, 0xD6)) return 1; + /* Block 55 is NOT full (w <= 0xd7f9) */ + if (e1(0xD7) && c2 <= (unsigned char)0xF9 /* r2(0xA1, 0xF9)*/) return 1; + /* Block 56-87 is level 2 chars, ordered by writing 3008 chars */ + if (r1(0xD8, 0xF7)) return 1; + } #endif +#ifdef NICK_GBK + /* GBK/3 */ + if (r1(0x81, 0xA0) && r2(0x40, 0xFE)) return 1; + /* GBK/4 */ + if (r2(0x40, 0xA0) && r1(0xAA, 0xFE)) return 1; +#endif + + /* all failed */ + return 0; + +#undef rw +#undef r1 +#undef r2 +#undef e1 } /* Chinese Nick Supporting Code (Switch Mode) - Modified by RexHsu on 08/09/00 */ @@ -965,6 +999,9 @@ int register_user(aClient *cptr, aClient *sptr, char *nick, char *username, char return xx; } find_shun(sptr); + xx = find_spamfilter_user(sptr); + if (xx < 0) + return xx; RunHookReturnInt(HOOKTYPE_PRE_LOCAL_CONNECT, sptr, !=0); } else @@ -1000,9 +1037,12 @@ int register_user(aClient *cptr, aClient *sptr, char *nick, char *username, char sendto_one(sptr, ":%s 004 %s %s CR1.8.03-%s %s %s", me.name, parv[0], me.name, version, umodestring, cmodestring); - - sendto_one(sptr, ":%s 005 %s " PROTOCTL_CLIENT_1, me.name, nick, PROTOCTL_PARAMETERS_1); - sendto_one(sptr, ":%s 005 %s " PROTOCTL_CLIENT_2, me.name, nick, PROTOCTL_PARAMETERS_2); + { + extern char *IsupportStrings[]; + int i; + for (i = 0; IsupportStrings[i]; i++) + sendto_one(sptr, rpl_str(RPL_ISUPPORT), me.name, nick, IsupportStrings[i]); + } #ifdef USE_SSL if (sptr->flags & FLAGS_SSL) if (sptr->ssl) @@ -1319,7 +1359,7 @@ CMD_FUNC(m_nick) } if (!IsULine(sptr) && (tklban = find_qline(sptr, nick, &ishold))) { - if (IsServer(sptr) && !ishold) + if (IsServer(sptr) && !ishold) /* server introducing new client */ { acptrs = (aClient *)find_server_b64_or_real(sptr->user == @@ -1332,15 +1372,14 @@ CMD_FUNC(m_nick) && !IsServer(sptr) ? sptr->name : ""), acptrs ? acptrs->name : "unknown server"); } - else if (!ishold) + + if (IsServer(cptr) && IsPerson(sptr)) /* remote user changing nick */ { - sendto_snomask(SNO_QLINE, "Q:lined nick %s from %s on %s", - nick, - *sptr->name ? sptr->name : "", - me.name); + sendto_snomask(SNO_QLINE, "Q:lined nick %s from %s on %s", nick, + sptr->name, sptr->srvptr ? sptr->srvptr->name : ""); } - if (!IsServer(cptr)) + if (!IsServer(cptr)) /* local */ { if (ishold) { @@ -1351,6 +1390,7 @@ CMD_FUNC(m_nick) } if (!IsOper(cptr)) { + sptr->since += 4; /* lag them up */ sendto_one(sptr, err_str(ERR_ERRONEUSNICKNAME), me.name, BadPtr(parv[0]) ? "*" : parv[0], nick, tklban->reason); @@ -1656,6 +1696,7 @@ CMD_FUNC(m_nick) cptr->name, backupbuf); sptr->lastnick = TStime(); } + newusr = 1; } else if (sptr->name[0] && IsPerson(sptr)) { @@ -1670,7 +1711,7 @@ CMD_FUNC(m_nick) { for (mp = sptr->user->channel; mp; mp = mp->next) { - if (is_banned(sptr, mp->chptr, BANCHK_NICK) && !is_chanownprotop(sptr, mp->chptr)) + if (!is_skochanop(sptr, mp->chptr) && is_banned(sptr, mp->chptr, BANCHK_NICK)) { sendto_one(sptr, err_str(ERR_BANNICKCHANGE), diff --git a/src/send.c b/src/send.c index d78645d3d..a10d5cb92 100644 --- a/src/send.c +++ b/src/send.c @@ -574,10 +574,11 @@ void sendto_chmodemucrap(aClient *from, aChannel *chptr, char *text) Member *lp; aClient *acptr; int i; + int remote = MyClient(from) ? 0 : 1; sprintf(tcmd, ":%s %s %s :%s", from->name, TOK_PRIVATE, chptr->chname, text); /* token */ sprintf(ccmd, ":%s %s %s :%s", from->name, MSG_PRIVATE, chptr->chname, text); /* msg */ - sprintf(xcmd, ":IRC PRIVMSG %s :%s: %s", chptr->chname, from->name, text); /* local */ + sprintf(xcmd, ":IRC!IRC@%s PRIVMSG %s :%s: %s", me.name, chptr->chname, from->name, text); /* local */ ++sentalong_marker; for (lp = chptr->members; lp; lp = lp->next) @@ -588,6 +589,8 @@ void sendto_chmodemucrap(aClient *from, aChannel *chptr, char *text) continue; if (!(lp->flags & (CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANPROT))) continue; + if (remote && (acptr->from == from->from)) /* don't send it back to where it came from */ + continue; i = acptr->from->slot; if (MyConnect(acptr) && IsRegisteredUser(acptr)) { @@ -1137,7 +1140,7 @@ void sendto_common_channels(aClient *user, char *pattern, ...) for (users = channels->chptr->members; users; users = users->next) { cptr = users->cptr; - if (!MyConnect(cptr) || sentalong[cptr->slot] == sentalong_marker) + if (!MyConnect(cptr) || (cptr->slot < 0) || (sentalong[cptr->slot] == sentalong_marker)) continue; if ((channels->chptr->mode.mode & MODE_AUDITORIUM) && !(is_chanownprotop(user, channels->chptr) || is_chanownprotop(cptr, channels->chptr))) diff --git a/src/umodes.c b/src/umodes.c index 6d80aa60a..d2ee92d18 100644 --- a/src/umodes.c +++ b/src/umodes.c @@ -91,6 +91,7 @@ long SNO_FNICKCHANGE = 0L; long SNO_QLINE = 0L; long SNO_SPAMF = 0L; long SNO_SNOTICE = 0L; +long SNO_OPER = 0L; long AllUmodes; /* All umodes */ long SendUmodes; /* All umodes which are sent to other servers (global umodes) */ @@ -166,6 +167,7 @@ void umode_init(void) SnomaskAdd(NULL, 'q', umode_allow_opers, &SNO_QLINE); SnomaskAdd(NULL, 'S', umode_allow_opers, &SNO_SPAMF); SnomaskAdd(NULL, 's', umode_allow_all, &SNO_SNOTICE); + SnomaskAdd(NULL, 'o', umode_allow_opers, &SNO_OPER); } void make_umodestr(void) diff --git a/src/win32/Win32GUI.c b/src/win32/Win32GUI.c deleted file mode 100644 index b88d52dd0..000000000 --- a/src/win32/Win32GUI.c +++ /dev/null @@ -1,2540 +0,0 @@ -/************************************************************************ - * IRC - Internet Relay Chat, Win32GUI.c - * Copyright (C) 2000-2003 David Flynn (DrBin) & Dominick Meglio (codemastr) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 1, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef IRCDTOTALVERSION -#define IRCDTOTALVERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 PATCH5 PATCH6 PATCH7 PATCH8 PATCH9 -#endif - -#define WIN32_VERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 -#include "resource.h" -#include "version.h" -#include "setup.h" -#ifdef INET6 -#include -#include -#endif -#include -#include -#include -#include "struct.h" -#include "common.h" -#include "sys.h" -#include "numeric.h" -#include -#include -#include -#include -#include -#include -#include "h.h" -#include -#include - -#define MIRC_COLORS "{\\colortbl;\\red255\\green255\\blue255;\\red0\\green0\\blue127;\\red0\\green147\\blue0;\\red255\\green0\\blue0;\\red127\\green0\\blue0;\\red156\\green0\\blue156;\\red252\\green127\\blue0;\\red255\\green255\\blue0;\\red0\\green252\\blue0;\\red0\\green147\\blue147;\\red0\\green255\\blue255;\\red0\\green0\\blue252;\\red255\\green0\\blue255;\\red127\\green127\\blue127;\\red210\\green210\\blue210;\\red0\\green0\\blue0;}" - -/* Lazy macro */ -#define ShowDialog(handle, inst, template, parent, proc) {\ - if (!IsWindow(handle)) { \ - handle = CreateDialog(inst, template, parent, (DLGPROC)proc); ShowWindow(handle, SW_SHOW); \ - }\ - else\ - SetForegroundWindow(handle);\ -} -/* Comments: - * - * DrBin did a great job with the original GUI, but he has been gone a long time - * in his absense it was decided it would be best to continue windows development. - * The new code is based on his so it will be pretty much similar in features, my - * main goal is to make it more stable. A lot of what I know about GUI coding - * I learned from DrBin so thanks to him for teaching me :) -- codemastr - */ - -LRESULT CALLBACK MainDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK LicenseDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK CreditsDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK DalDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK HelpDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK StatusDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK ConfigErrorDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK ColorDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK FromVarDLG(HWND, UINT, WPARAM, LPARAM, unsigned char *, unsigned char **); -LRESULT CALLBACK FromFileReadDLG(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK FromFileDLG(HWND, UINT, WPARAM, LPARAM); - -typedef struct { - int *size; - unsigned char **buffer; -} StreamIO; - -extern void SocketLoop(void *dummy); -int CountRTFSize(unsigned char *); -void IRCToRTF(unsigned char *, unsigned char *); -HINSTANCE hInst; -NOTIFYICONDATA SysTray; -void CleanUp(void); -HTREEITEM AddItemToTree(HWND, LPSTR, int, short); -void win_map(aClient *, HWND, short); -extern Link *Servers; -extern ircstats IRCstats; -unsigned char *errors = NULL, *RTFBuf = NULL; -extern aMotd *botmotd, *opermotd, *motd, *rules; -extern VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv); -extern BOOL IsService; -void CleanUp(void) -{ - Shell_NotifyIcon(NIM_DELETE ,&SysTray); -} -void CleanUpSegv(int sig) -{ - Shell_NotifyIcon(NIM_DELETE ,&SysTray); -} -HWND hStatusWnd; -HWND hwIRCDWnd=NULL; -HWND hwTreeView; -HWND hWndMod; -HANDLE hMainThread = 0; -UINT WM_TASKBARCREATED, WM_FINDMSGSTRING; -FARPROC lpfnOldWndProc; -HMENU hContext; -OSVERSIONINFO VerInfo; -char OSName[256]; -HWND hFind; -#ifdef USE_LIBCURL -extern char *find_loaded_remote_include(char *url); -#endif - -void TaskBarCreated() { - HICON hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(ICO_MAIN), IMAGE_ICON,16, 16, 0); - SysTray.cbSize = sizeof(NOTIFYICONDATA); - SysTray.hIcon = hIcon; - SysTray.hWnd = hwIRCDWnd; - SysTray.uCallbackMessage = WM_USER; - SysTray.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE; - SysTray.uID = 0; - lstrcpy(SysTray.szTip, WIN32_VERSION); - Shell_NotifyIcon(NIM_ADD ,&SysTray); -} - -LRESULT LinkSubClassFunc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { - static HCURSOR hCursor; - if (!hCursor) - hCursor = LoadCursor(hInst, MAKEINTRESOURCE(CUR_HAND)); - if (Message == WM_MOUSEMOVE || WM_LBUTTONUP) - SetCursor(hCursor); - - return CallWindowProc((WNDPROC)lpfnOldWndProc, hWnd, Message, wParam, lParam); -} - - - -LRESULT RESubClassFunc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { - POINT p; - RECT r; - DWORD start, end; - unsigned char string[500]; - - if (Message == WM_GETDLGCODE) - return DLGC_WANTALLKEYS; - - - if (Message == WM_CONTEXTMENU) { - p.x = GET_X_LPARAM(lParam); - p.y = GET_Y_LPARAM(lParam); - if (GET_X_LPARAM(lParam) == -1 && GET_Y_LPARAM(lParam) == -1) { - GetClientRect(hWnd, &r); - p.x = (int)((r.left + r.right)/2); - p.y = (int)((r.top + r.bottom)/2); - ClientToScreen(hWnd,&p); - } - if (!SendMessage(hWnd, EM_CANUNDO, 0, 0)) - EnableMenuItem(hContext, IDM_UNDO, MF_BYCOMMAND|MF_GRAYED); - else - EnableMenuItem(hContext, IDM_UNDO, MF_BYCOMMAND|MF_ENABLED); - if (!SendMessage(hWnd, EM_CANPASTE, 0, 0)) - EnableMenuItem(hContext, IDM_PASTE, MF_BYCOMMAND|MF_GRAYED); - else - EnableMenuItem(hContext, IDM_PASTE, MF_BYCOMMAND|MF_ENABLED); - if (GetWindowLong(hWnd, GWL_STYLE) & ES_READONLY) { - EnableMenuItem(hContext, IDM_CUT, MF_BYCOMMAND|MF_GRAYED); - EnableMenuItem(hContext, IDM_DELETE, MF_BYCOMMAND|MF_GRAYED); - } - else { - EnableMenuItem(hContext, IDM_CUT, MF_BYCOMMAND|MF_ENABLED); - EnableMenuItem(hContext, IDM_DELETE, MF_BYCOMMAND|MF_ENABLED); - } - SendMessage(hWnd, EM_GETSEL, (WPARAM)&start, (LPARAM)&end); - if (start == end) - EnableMenuItem(hContext, IDM_COPY, MF_BYCOMMAND|MF_GRAYED); - else - EnableMenuItem(hContext, IDM_COPY, MF_BYCOMMAND|MF_ENABLED); - TrackPopupMenu(hContext,TPM_LEFTALIGN|TPM_RIGHTBUTTON,p.x,p.y,0,GetParent(hWnd),NULL); - return 0; - } - - return CallWindowProc((WNDPROC)lpfnOldWndProc, hWnd, Message, wParam, lParam); -} - -/* Somewhat respectable RTF to IRC parser - * (c) 2001 codemastr - */ -DWORD CALLBACK SplitIt(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { - StreamIO *stream = (StreamIO*)dwCookie; - if (*stream->size == 0) - { - pcb = 0; - *stream->buffer = 0; - } - else if (cb <= *stream->size) { - memcpy(pbBuff, *stream->buffer, cb); - *stream->buffer += cb; - *stream->size -= cb; - *pcb = cb; - - } - else { - memcpy(pbBuff, *stream->buffer, *stream->size); - *pcb = *stream->size; - *stream->size = 0; - } - return 0; -} - -DWORD CALLBACK BufferIt(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { - unsigned char *buf2; - static long size = 0; - if (!RTFBuf) - size = 0; - - buf2 = MyMalloc(size+cb+1); - - if (RTFBuf) - memcpy(buf2,RTFBuf,size); - - memcpy(buf2+size,pbBuff,cb); - - size += cb; - if (RTFBuf) - MyFree(RTFBuf); - - RTFBuf = buf2; - - pcb = &cb; - return 0; -} - -#define iseol(x) ((x) == '\r' || (x) == '\n') - -typedef struct colorlist { - struct colorlist *next; - unsigned char *color; -} IRCColor; - -IRCColor *TextColors = NULL; -IRCColor *BgColors = NULL; - -void ColorPush(unsigned char *color, IRCColor **stack) -{ - IRCColor *t = MyMallocEx(sizeof(IRCColor)); - t->color = strdup(color); - t->next = *stack; - (*stack) = t; -} - -void ColorPop(IRCColor **stack) -{ - IRCColor *p = *stack; - if (!(*stack)) - return; - MyFree(p->color); - - *stack = p->next; - MyFree(p); -} - -void ColorEmpty(IRCColor **stack) -{ - IRCColor *t, *next; - for (t = *stack; t; t = next) - { - next = t->next; - MyFree(t->color); - MyFree(t); - } -} - -DWORD CALLBACK RTFToIRC(int fd, unsigned char *pbBuff, long cb) -{ - unsigned char *buffer = malloc(cb*2); - int colors[17], bold = 0, uline = 0, incolor = 0, inbg = 0; - int lastwascf = 0, lastwascf0 = 0; - int i = 0; - TextColors = BgColors = NULL; - bzero(buffer, cb); - - for (; *pbBuff; pbBuff++) - { - if (iseol(*pbBuff) || *pbBuff == '{' || *pbBuff == '}') - continue; - else if (*pbBuff == '\\') - { - /* RTF control sequence */ - pbBuff++; - if (*pbBuff == '\\' || *pbBuff == '{' || *pbBuff == '}') - buffer[i++] = *pbBuff; - else if (*pbBuff == '\'') - { - /* Extended ASCII character */ - unsigned char ltr, ultr[3]; - ultr[0] = *(++pbBuff); - ultr[1] = *(++pbBuff); - ultr[2] = 0; - ltr = strtoul(ultr,NULL,16); - buffer[i++] = ltr; - } - else - { - int j; - char cmd[128]; - /* Capture the control sequence */ - for (j = 0; *pbBuff && *pbBuff != '\\' && !isspace(*pbBuff) && - !iseol(*pbBuff); pbBuff++) - { - cmd[j++] = *pbBuff; - } - if (*pbBuff != ' ') - pbBuff--; - cmd[j] = 0; - if (!strcmp(cmd, "fonttbl{")) - { - /* Eat the parameter */ - while (*pbBuff && *pbBuff != '}') - pbBuff++; - lastwascf = lastwascf0 = 0; - } - if (!strcmp(cmd, "colortbl")) - { - char color[128]; - int k = 0, m = 1; - /* Capture the color table */ - while (*pbBuff && !isalnum(*pbBuff)) - pbBuff++; - for (; *pbBuff && *pbBuff != '}'; pbBuff++) - { - if (*pbBuff == ';') - { - color[k]=0; - if (!strcmp(color, "\\red255\\green255\\blue255")) - colors[m++] = 0; - else if (!strcmp(color, "\\red0\\green0\\blue0")) - colors[m++] = 1; - else if (!strcmp(color, "\\red0\\green0\\blue127")) - colors[m++] = 2; - else if (!strcmp(color, "\\red0\\green147\\blue0")) - colors[m++] = 3; - else if (!strcmp(color, "\\red255\\green0\\blue0")) - colors[m++] = 4; - else if (!strcmp(color, "\\red127\\green0\\blue0")) - colors[m++] = 5; - else if (!strcmp(color, "\\red156\\green0\\blue156")) - colors[m++] = 6; - else if (!strcmp(color, "\\red252\\green127\\blue0")) - colors[m++] = 7; - else if (!strcmp(color, "\\red255\\green255\\blue0")) - colors[m++] = 8; - else if (!strcmp(color, "\\red0\\green252\\blue0")) - colors[m++] = 9; - else if (!strcmp(color, "\\red0\\green147\\blue147")) - colors[m++] = 10; - else if (!strcmp(color, "\\red0\\green255\\blue255")) - colors[m++] = 11; - else if (!strcmp(color, "\\red0\\green0\\blue252")) - colors[m++] = 12; - else if (!strcmp(color, "\\red255\\green0\\blue255")) - colors[m++] = 13; - else if (!strcmp(color, "\\red127\\green127\\blue127")) - colors[m++] = 14; - else if (!strcmp(color, "\\red210\\green210\\blue210")) - colors[m++] = 15; - k=0; - } - else - color[k++] = *pbBuff; - } - lastwascf = lastwascf0 = 0; - } - else if (!strcmp(cmd, "tab")) - { - buffer[i++] = '\t'; - lastwascf = lastwascf0 = 0; - } - else if (!strcmp(cmd, "par")) - { - if (bold || uline || incolor || inbg) - buffer[i++] = '\17'; - buffer[i++] = '\r'; - buffer[i++] = '\n'; - if (!*(pbBuff+3) || *(pbBuff+3) != '}') - { - if (bold) - buffer[i++] = '\2'; - if (uline) - buffer[i++] = '\37'; - if (incolor) - { - buffer[i++] = '\3'; - strcat(buffer, TextColors->color); - i += strlen(TextColors->color); - if (inbg) - { - buffer[i++] = ','; - strcat(buffer, BgColors->color); - i += strlen(BgColors->color); - } - } - else if (inbg) { - buffer[i++] = '\3'; - buffer[i++] = '0'; - buffer[i++] = '1'; - buffer[i++] = ','; - strcat(buffer, BgColors->color); - i += strlen(BgColors->color); - } -} - } - else if (!strcmp(cmd, "b")) - { - bold = 1; - buffer[i++] = '\2'; - lastwascf = lastwascf0 = 0; - } - else if (!strcmp(cmd, "b0")) - { - bold = 0; - buffer[i++] = '\2'; - lastwascf = lastwascf0 = 0; - } - else if (!strcmp(cmd, "ul")) - { - uline = 1; - buffer[i++] = '\37'; - lastwascf = lastwascf0 = 0; - } - else if (!strcmp(cmd, "ulnone")) - { - uline = 0; - buffer[i++] = '\37'; - lastwascf = lastwascf0 = 0; - } - else if (!strcmp(cmd, "cf0")) - { - lastwascf0 = 1; - lastwascf = 0; - } - else if (!strcmp(cmd, "highlight0")) - { - inbg = 0; - ColorPop(&BgColors); - buffer[i++] = '\3'; - if (lastwascf0) - { - incolor = 0; - ColorPop(&TextColors); - lastwascf0 = 0; - } - else if (incolor) - { - strcat(buffer, TextColors->color); - i += strlen(TextColors->color); - buffer[i++] = ','; - buffer[i++] = '0'; - buffer[i++] = '0'; - } - lastwascf = lastwascf0 = 0; - } - else if (!strncmp(cmd, "cf", 2)) - { - unsigned char number[3]; - int num; - incolor = 1; - strcpy(number, &cmd[2]); - num = atoi(number); - buffer[i++] = '\3'; - if (colors[num] < 10) - sprintf(number, "0%d", colors[num]); - else - sprintf(number, "%d", colors[num]); - ColorPush(number, &TextColors); - strcat(buffer,number); - i += strlen(number); - lastwascf = 1; - lastwascf0 = 0; - } - else if (!strncmp(cmd, "highlight", 9)) - { - int num; - unsigned char number[3]; - inbg = 1; - num = atoi(&cmd[9]); - if (colors[num] < 10) - sprintf(number, "0%d", colors[num]); - else - sprintf(number, "%d", colors[num]); - if (incolor && !lastwascf) - { - buffer[i++] = '\3'; - strcat(buffer, TextColors->color); - i += strlen(TextColors->color); - } - else if (!incolor) - { - buffer[i++] = '\3'; - buffer[i++] = '0'; - buffer[i++] = '1'; - } - buffer[i++] = ','; - strcat(buffer, number); - i += strlen(number); - ColorPush(number, &BgColors); - lastwascf = lastwascf0 = 0; - } - else - lastwascf = lastwascf0 = 0; - - if (lastwascf0 && incolor) - { - incolor = 0; - ColorPop(&TextColors); - buffer[i++] = '\3'; - } - } - } - else - { - lastwascf = lastwascf0 = 0; - buffer[i++] = *pbBuff; - } - - } - write(fd, buffer, i); - close(fd); - ColorEmpty(&TextColors); - ColorEmpty(&BgColors); - return 0; -} - -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - unsigned char *s; - HWND hWnd; - WSADATA WSAData; - HICON hIcon; - SERVICE_TABLE_ENTRY DispatchTable[] = { - { "UnrealIRCd", ServiceMain }, - { 0, 0 } - }; - DWORD need; - - VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&VerInfo); - if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { - SC_HANDLE hService, hSCManager = OpenSCManager(NULL, NULL, GENERIC_EXECUTE); - if ((hService = OpenService(hSCManager, "UnrealIRCd", GENERIC_EXECUTE))) { - int save_err = 0; - StartServiceCtrlDispatcher(DispatchTable); - if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) - { - SERVICE_STATUS status; - /* Restart handling, it's ugly but it's as - * pretty as it is gonna get :) - */ - if (__argc == 2 && !strcmp(__argv[1], "restartsvc")) - { - QueryServiceStatus(hService, &status); - if (status.dwCurrentState != SERVICE_STOPPED) - { - ControlService(hService, - SERVICE_CONTROL_STOP, &status); - while (status.dwCurrentState == SERVICE_STOP_PENDING) - { - QueryServiceStatus(hService, &status); - if (status.dwCurrentState != SERVICE_STOPPED) - Sleep(1000); - } - } - } - if (!StartService(hService, 0, NULL)) - save_err = GetLastError(); - } - - CloseServiceHandle(hService); - CloseServiceHandle(hSCManager); - if (save_err != ERROR_SERVICE_DISABLED) - exit(0); - } - } - strcpy(OSName, "Windows "); - if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { - if (VerInfo.dwMajorVersion == 4) { - if (VerInfo.dwMinorVersion == 0) { - strcat(OSName, "95 "); - if (!strcmp(VerInfo.szCSDVersion," C")) - strcat(OSName, "OSR2 "); - } - else if (VerInfo.dwMinorVersion == 10) { - strcat(OSName, "98 "); - if (!strcmp(VerInfo.szCSDVersion, " A")) - strcat(OSName, "SE "); - } - else if (VerInfo.dwMinorVersion == 90) - strcat(OSName, "Me "); - } - } - else if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { - if (VerInfo.dwMajorVersion == 3 && VerInfo.dwMinorVersion == 51) - strcat(OSName, "NT 3.51 "); - else if (VerInfo.dwMajorVersion == 4 && VerInfo.dwMinorVersion == 0) - strcat(OSName, "NT 4.0 "); - else if (VerInfo.dwMajorVersion == 5) { - if (VerInfo.dwMinorVersion == 0) - strcat(OSName, "2000 "); - else if (VerInfo.dwMinorVersion == 1) - strcat(OSName, "XP "); - else if (VerInfo.dwMinorVersion == 2) - strcat(OSName, "Server 2003 "); - } - strcat(OSName, VerInfo.szCSDVersion); - } - if (OSName[strlen(OSName)-1] == ' ') - OSName[strlen(OSName)-1] = 0; - InitCommonControls(); - WM_TASKBARCREATED = RegisterWindowMessage("TaskbarCreated"); - WM_FINDMSGSTRING = RegisterWindowMessage(FINDMSGSTRING); - atexit(CleanUp); - if(!LoadLibrary("riched20.dll")) - LoadLibrary("riched32.dll"); - InitDebug(); - - if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0) - { - MessageBox(NULL, "Unable to initialize WinSock", "UnrealIRCD Initalization Error", MB_OK); - return FALSE; - } - hInst = hInstance; - - hWnd = CreateDialog(hInstance, "WIRCD", 0, (DLGPROC)MainDLG); - hwIRCDWnd = hWnd; - - TaskBarCreated(); - - if (InitwIRCD(__argc, __argv) != 1) - { - MessageBox(NULL, "UnrealIRCd has failed to initialize in InitwIRCD()", "UnrealIRCD Initalization Error" ,MB_OK); - return FALSE; - } - ShowWindow(hWnd, SW_SHOW); - hMainThread = (HANDLE)_beginthread(SocketLoop, 0, NULL); - while (GetMessage(&msg, NULL, 0, 0)) - { - if (!IsWindow(hStatusWnd) || !IsDialogMessage(hStatusWnd, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - return FALSE; - -} - -LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ -static HCURSOR hCursor; -static HMENU hRehash, hAbout, hConfig, hTray, hLogs; - - unsigned char *argv[3]; - aClient *paClient; - unsigned char *msg; - POINT p; - - if (message == WM_TASKBARCREATED){ - TaskBarCreated(); - return TRUE; - } - - switch (message) - { - case WM_INITDIALOG: { - ShowWindow(hDlg, SW_HIDE); - hCursor = LoadCursor(hInst, MAKEINTRESOURCE(CUR_HAND)); - hContext = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_CONTEXT)),0); - /* Rehash popup menu */ - hRehash = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_REHASH)),0); - /* About popup menu */ - hAbout = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_ABOUT)),0); - /* Systray popup menu set the items to point to the other menus*/ - hTray = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_SYSTRAY)),0); - ModifyMenu(hTray, IDM_REHASH, MF_BYCOMMAND|MF_POPUP|MF_STRING, (UINT)hRehash, "&Rehash"); - ModifyMenu(hTray, IDM_ABOUT, MF_BYCOMMAND|MF_POPUP|MF_STRING, (UINT)hAbout, "&About"); - - SetWindowText(hDlg, WIN32_VERSION); - SendMessage(hDlg, WM_SETICON, (WPARAM)ICON_SMALL, - (LPARAM)(HICON)LoadImage(hInst, MAKEINTRESOURCE(ICO_MAIN), IMAGE_ICON,16, 16, 0)); - SendMessage(hDlg, WM_SETICON, (WPARAM)ICON_BIG, - (LPARAM)(HICON)LoadImage(hInst, MAKEINTRESOURCE(ICO_MAIN), IMAGE_ICON,32, 32, 0)); - return (TRUE); - } - case WM_SIZE: { - if (wParam & SIZE_MINIMIZED) { - ShowWindow(hDlg,SW_HIDE); - } - return 0; - } - case WM_CLOSE: { - if (MessageBox(hDlg, "Close UnrealIRCd?", "Are you sure?", MB_YESNO|MB_ICONQUESTION) == IDNO) - return 0; - else { - DestroyWindow(hDlg); - exit(0); - } - } - - case WM_USER: { - switch(LOWORD(lParam)) { - case WM_LBUTTONDBLCLK: - ShowWindow(hDlg, SW_SHOW); - ShowWindow(hDlg,SW_RESTORE); - SetForegroundWindow(hDlg); - case WM_RBUTTONDOWN: - SetForegroundWindow(hDlg); - break; - case WM_RBUTTONUP: { - unsigned long i = 60000; - GetCursorPos(&p); - DestroyMenu(hConfig); - hConfig = CreatePopupMenu(); - DestroyMenu(hLogs); - hLogs = CreatePopupMenu(); - AppendMenu(hConfig, MF_STRING, IDM_CONF, CPATH); - if (conf_log) { - ConfigItem_log *logs; - AppendMenu(hConfig, MF_POPUP|MF_STRING, (UINT)hLogs, "Logs"); - for (logs = conf_log; logs; logs = (ConfigItem_log *)logs->next) { - AppendMenu(hLogs, MF_STRING, i++, logs->file); - } - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - if (conf_include) { - ConfigItem_include *inc; - for (inc = conf_include; inc; inc = (ConfigItem_include *)inc->next) { - if (inc->flag.type & INCLUDE_NOTLOADED) - continue; -#ifdef USE_LIBCURL - if (inc->flag.type & INCLUDE_REMOTE) - AppendMenu(hConfig, MF_STRING, i++, inc->url); - else -#endif - AppendMenu(hConfig, MF_STRING, i++, inc->file); - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - } - - AppendMenu(hConfig, MF_STRING, IDM_MOTD, MPATH); - AppendMenu(hConfig, MF_STRING, IDM_SMOTD, SMPATH); - AppendMenu(hConfig, MF_STRING, IDM_OPERMOTD, OPATH); - AppendMenu(hConfig, MF_STRING, IDM_BOTMOTD, BPATH); - AppendMenu(hConfig, MF_STRING, IDM_RULES, RPATH); - - if (conf_tld) { - ConfigItem_tld *tlds; - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - for (tlds = conf_tld; tlds; tlds = (ConfigItem_tld *)tlds->next) { - if (!tlds->flag.motdptr) - AppendMenu(hConfig, MF_STRING, i++, tlds->motd_file); - if (!tlds->flag.rulesptr) - AppendMenu(hConfig, MF_STRING, i++, tlds->rules_file); - if (tlds->smotd_file) - AppendMenu(hConfig, MF_STRING, i++, tlds->smotd_file); - } - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - AppendMenu(hConfig, MF_STRING, IDM_NEW, "New File"); - ModifyMenu(hTray, IDM_CONFIG, MF_BYCOMMAND|MF_POPUP|MF_STRING, (UINT)hConfig, "&Config"); - TrackPopupMenu(hTray, TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); - /* Kludge for a win bug */ - SendMessage(hDlg, WM_NULL, 0, 0); - break; - } - } - return 0; - } - case WM_DESTROY: - return 0; - case WM_MOUSEMOVE: { - POINT p; - p.x = LOWORD(lParam); - p.y = HIWORD(lParam); - - if ((p.x >= 24) && (p.x <= 78) && (p.y >= 178) && (p.y <= 190)) - SetCursor(hCursor); - else if ((p.x >= 85) && (p.x <= 132) && (p.y >= 178) && (p.y <= 190)) - SetCursor(hCursor); - else if ((p.x >= 140) && (p.x <= 186) && (p.y >= 178) && (p.y <= 190)) - SetCursor(hCursor); - else if ((p.x >= 194) && (p.x <= 237) && (p.y >= 178) && (p.y <= 190)) - SetCursor(hCursor); - else if ((p.x >= 245) && (p.x <= 311) && (p.y >= 178) && (p.y <= 190)) - SetCursor(hCursor); - return 0; - } - case WM_LBUTTONDOWN: { - POINT p; - p.x = LOWORD(lParam); - p.y = HIWORD(lParam); - if ((p.x >= 24) && (p.x <= 78) && (p.y >= 178) && (p.y <= 190)) - { - ClientToScreen(hDlg,&p); - TrackPopupMenu(hRehash,TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); - return 0; - } - else if ((p.x >= 85) && (p.x <= 132) && (p.y >= 178) && (p.y <= 190)) { - ShowDialog(hStatusWnd, hInst, "Status", hDlg, StatusDLG); - return 0; - } - else if ((p.x >= 140) && (p.x <= 186) && (p.y >= 178) && (p.y <= 190)) { - unsigned long i = 60000; - ClientToScreen(hDlg,&p); - DestroyMenu(hConfig); - hConfig = CreatePopupMenu(); - DestroyMenu(hLogs); - hLogs = CreatePopupMenu(); - - AppendMenu(hConfig, MF_STRING, IDM_CONF, CPATH); - if (conf_log) { - ConfigItem_log *logs; - AppendMenu(hConfig, MF_POPUP|MF_STRING, (UINT)hLogs, "Logs"); - for (logs = conf_log; logs; logs = (ConfigItem_log *)logs->next) { - AppendMenu(hLogs, MF_STRING, i++, logs->file); - } - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - - if (conf_include) { - ConfigItem_include *inc; - for (inc = conf_include; inc; inc = (ConfigItem_include *)inc->next) { -#ifdef USE_LIBCURL - if (inc->flag.type & INCLUDE_REMOTE) - AppendMenu(hConfig, MF_STRING, i++, inc->url); - else -#endif - AppendMenu(hConfig, MF_STRING, i++, inc->file); - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - } - - AppendMenu(hConfig, MF_STRING, IDM_MOTD, MPATH); - AppendMenu(hConfig, MF_STRING, IDM_SMOTD, SMPATH); - AppendMenu(hConfig, MF_STRING, IDM_OPERMOTD, OPATH); - AppendMenu(hConfig, MF_STRING, IDM_BOTMOTD, BPATH); - AppendMenu(hConfig, MF_STRING, IDM_RULES, RPATH); - - if (conf_tld) { - ConfigItem_tld *tlds; - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - for (tlds = conf_tld; tlds; tlds = (ConfigItem_tld *)tlds->next) { - if (!tlds->flag.motdptr) - AppendMenu(hConfig, MF_STRING, i++, tlds->motd_file); - if (!tlds->flag.rulesptr) - AppendMenu(hConfig, MF_STRING, i++, tlds->rules_file); - if (tlds->smotd_file) - AppendMenu(hConfig, MF_STRING, i++, tlds->smotd_file); - } - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - AppendMenu(hConfig, MF_STRING, IDM_NEW, "New File"); - TrackPopupMenu(hConfig,TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); - - return 0; - } - else if ((p.x >= 194) && (p.x <= 237) && (p.y >= 178) && (p.y <= 190)) { - ClientToScreen(hDlg,&p); - TrackPopupMenu(hAbout,TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); - return 0; - } - else if ((p.x >= 245) && (p.x <= 311) && (p.y >= 178) && (p.y <= 190)) { - if (MessageBox(hDlg, "Close UnrealIRCd?", "Are you sure?", MB_YESNO|MB_ICONQUESTION) == IDNO) - return 0; - else { - DestroyWindow(hDlg); - exit(0); - } - } - } - case WM_COMMAND: { - if (LOWORD(wParam) >= 60000 && HIWORD(wParam) == 0 && !lParam) { - unsigned char path[MAX_PATH]; - if (GetMenuString(hLogs, LOWORD(wParam), path, MAX_PATH, MF_BYCOMMAND)) - DialogBoxParam(hInst, "FromVar", hDlg, (DLGPROC)FromFileReadDLG, (LPARAM)path); - - else - { - GetMenuString(hConfig,LOWORD(wParam), path, MAX_PATH, MF_BYCOMMAND); -#ifdef USE_LIBCURL - if (url_is_valid(path)) - { - char *file = find_loaded_remote_include(path); - DialogBoxParam(hInst, "FromVar", hDlg, (DLGPROC)FromFileReadDLG, (LPARAM)file); - } - else -#endif - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, (LPARAM)path); - } - return FALSE; - } - - switch(LOWORD(wParam)) { - - case IDM_STATUS: - ShowDialog(hStatusWnd, hInst, "Status", hDlg, StatusDLG); - break; - case IDM_SHUTDOWN: - if (MessageBox(hDlg, "Close UnrealIRCd?", "Are you sure?", MB_YESNO|MB_ICONQUESTION) == IDNO) - return 0; - else { - DestroyWindow(hDlg); - exit(0); - } - break; - - case IDM_RHALL: - MessageBox(NULL, "Rehashing all files", "Rehashing", MB_OK); - sendto_realops("Rehashing all files via the console"); - rehash(&me,&me,0); - reread_motdsandrules(); - break; - case IDM_RHCONF: - MessageBox(NULL, "Rehashing the Config file", "Rehashing", MB_OK); - sendto_realops("Rehashing the Config file via the console"); - rehash(&me,&me,0); - break; - case IDM_RHMOTD: { - ConfigItem_tld *tlds; - aMotd *amotd; - MessageBox(NULL, "Rehashing all MOTD and Rules files", "Rehashing", MB_OK); - rehash_motdrules(); - sendto_realops("Rehashing all MOTD and Rules files via the console"); - break; - } - case IDM_RHOMOTD: - MessageBox(NULL, "Rehashing the OperMOTD", "Rehashing", MB_OK); - opermotd = (aMotd *) read_file(OPATH, &opermotd); - sendto_realops("Rehashing the OperMOTD via the console"); - break; - case IDM_RHBMOTD: - MessageBox(NULL, "Rehashing the BotMOTD", "Rehashing", MB_OK); - botmotd = (aMotd *) read_file(BPATH, &botmotd); - sendto_realops("Rehashing the BotMOTD via the console"); - break; - case IDM_LICENSE: - DialogBox(hInst, "FromVar", hDlg, (DLGPROC)LicenseDLG); - break; - case IDM_CREDITS: - DialogBox(hInst, "FromVar", hDlg, (DLGPROC)CreditsDLG); - break; - case IDM_DAL: - DialogBox(hInst, "FromVar", hDlg, (DLGPROC)DalDLG); - break; - case IDM_HELP: - DialogBox(hInst, "Help", hDlg, (DLGPROC)HelpDLG); - break; - case IDM_CONF: - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, - (LPARAM)CPATH); - break; - case IDM_MOTD: - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, - (LPARAM)MPATH); - break; - case IDM_SMOTD: - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, - (LPARAM)SMPATH); - break; - case IDM_OPERMOTD: - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, - (LPARAM)OPATH); - break; - case IDM_BOTMOTD: - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, - (LPARAM)BPATH); - break; - case IDM_RULES: - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, - (LPARAM)RPATH); - break; - case IDM_NEW: - DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, (LPARAM)NULL); - break; - - } - } - } - return (FALSE); -} - -LRESULT CALLBACK LicenseDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - return FromVarDLG(hDlg, message, wParam, lParam, "UnrealIRCd License", gnulicense); -} - -LRESULT CALLBACK CreditsDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - return FromVarDLG(hDlg, message, wParam, lParam, "UnrealIRCd Credits", unrealcredits); -} - -LRESULT CALLBACK DalDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - return FromVarDLG(hDlg, message, wParam, lParam, "UnrealIRCd DALnet Credits", dalinfotext); -} - -LRESULT CALLBACK FromVarDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam, -unsigned char *title, unsigned char **s) { - HWND hWnd; - switch (message) { - case WM_INITDIALOG: { - unsigned char String[16384]; - int size; - unsigned char *RTFString; - StreamIO *stream = malloc(sizeof(StreamIO)); - EDITSTREAM edit; - SetWindowText(hDlg, title); - bzero(String, 16384); - lpfnOldWndProc = (FARPROC)SetWindowLong(GetDlgItem(hDlg, IDC_TEXT), -GWL_WNDPROC, (DWORD)RESubClassFunc); - while (*s) { - strcat(String, *s++); - if (*s) - strcat(String, "\r\n"); - } - size = CountRTFSize(String)+1; - RTFString = malloc(size); - bzero(RTFString, size); - IRCToRTF(String,RTFString); - RTFBuf = RTFString; - size--; - stream->size = &size; - stream->buffer = &RTFBuf; - edit.dwCookie = (UINT)stream; - edit.pfnCallback = SplitIt; - SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_STREAMIN, -(WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); - free(RTFString); - free(stream); - return (TRUE); - } - - case WM_COMMAND: { - hWnd = GetDlgItem(hDlg, IDC_TEXT); - if (LOWORD(wParam) == IDOK) - return EndDialog(hDlg, TRUE); - if (LOWORD(wParam) == IDM_COPY) { - SendMessage(hWnd, WM_COPY, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_SELECTALL) { - SendMessage(hWnd, EM_SETSEL, 0, -1); - return 0; - } - if (LOWORD(wParam) == IDM_PASTE) { - SendMessage(hWnd, WM_PASTE, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_CUT) { - SendMessage(hWnd, WM_CUT, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_UNDO) { - SendMessage(hWnd, EM_UNDO, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_DELETE) { - SendMessage(hWnd, WM_CLEAR, 0, 0); - return 0; - } - - - break; - } - case WM_CLOSE: - EndDialog(hDlg, TRUE); - break; - case WM_DESTROY: - break; - } - return (FALSE); -} - -LRESULT CALLBACK FromFileReadDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - HWND hWnd; - switch (message) { - case WM_INITDIALOG: { - int fd,len; - unsigned char *buffer = '\0', *string = '\0'; - EDITSTREAM edit; - StreamIO *stream = malloc(sizeof(StreamIO)); - unsigned char szText[256]; - struct stat sb; - HWND hWnd = GetDlgItem(hDlg, IDC_TEXT), hTip; - wsprintf(szText, "UnrealIRCd Viewer - %s", (unsigned char *)lParam); - SetWindowText(hDlg, szText); - lpfnOldWndProc = (FARPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)RESubClassFunc); - if ((fd = open((unsigned char *)lParam, _O_RDONLY|_O_BINARY)) != -1) { - fstat(fd,&sb); - /* Only allocate the amount we need */ - buffer = malloc(sb.st_size+1); - buffer[0] = 0; - len = read(fd, buffer, sb.st_size); - buffer[len] = 0; - len = CountRTFSize(buffer)+1; - string = malloc(len); - bzero(string,len); - IRCToRTF(buffer,string); - RTFBuf = string; - len--; - stream->size = &len; - stream->buffer = &RTFBuf; - edit.dwCookie = (UINT)stream; - edit.pfnCallback = SplitIt; - SendMessage(hWnd, EM_EXLIMITTEXT, 0, (LPARAM)0x7FFFFFFF); - SendMessage(hWnd, EM_STREAMIN, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); - close(fd); - RTFBuf = NULL; - free(buffer); - free(string); - free(stream); - } - return (TRUE); - } - case WM_COMMAND: { - hWnd = GetDlgItem(hDlg, IDC_TEXT); - if (LOWORD(wParam) == IDOK) - return EndDialog(hDlg, TRUE); - if (LOWORD(wParam) == IDM_COPY) { - SendMessage(hWnd, WM_COPY, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_SELECTALL) { - SendMessage(hWnd, EM_SETSEL, 0, -1); - return 0; - } - if (LOWORD(wParam) == IDM_PASTE) { - SendMessage(hWnd, WM_PASTE, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_CUT) { - SendMessage(hWnd, WM_CUT, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_UNDO) { - SendMessage(hWnd, EM_UNDO, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_DELETE) { - SendMessage(hWnd, WM_CLEAR, 0, 0); - return 0; - } - - - break; - } - case WM_CLOSE: - EndDialog(hDlg, TRUE); - break; - case WM_DESTROY: - break; - } - return (FALSE); -} - - -LRESULT CALLBACK HelpDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - static HFONT hFont; - static HCURSOR hCursor; - switch (message) { - case WM_INITDIALOG: - hCursor = LoadCursor(hInst, MAKEINTRESOURCE(CUR_HAND)); - hFont = CreateFont(8,0,0,0,0,0,1,0,ANSI_CHARSET,0,0,PROOF_QUALITY,0,"MS Sans Serif"); - SendMessage(GetDlgItem(hDlg, IDC_EMAIL), WM_SETFONT, (WPARAM)hFont,TRUE); - SendMessage(GetDlgItem(hDlg, IDC_URL), WM_SETFONT, (WPARAM)hFont,TRUE); - lpfnOldWndProc = (FARPROC)SetWindowLong(GetDlgItem(hDlg, IDC_EMAIL), GWL_WNDPROC, (DWORD)LinkSubClassFunc); - SetWindowLong(GetDlgItem(hDlg, IDC_URL), GWL_WNDPROC, (DWORD)LinkSubClassFunc); - return (TRUE); - - case WM_DRAWITEM: { - LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam; - unsigned char text[500]; - COLORREF oldtext; - RECT focus; - GetWindowText(lpdis->hwndItem, text, 500); - if (wParam == IDC_URL || IDC_EMAIL) { - FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_3DFACE)); - oldtext = SetTextColor(lpdis->hDC, RGB(0,0,255)); - DrawText(lpdis->hDC, text, strlen(text), &lpdis->rcItem, DT_CENTER|DT_VCENTER); - SetTextColor(lpdis->hDC, oldtext); - if (lpdis->itemState & ODS_FOCUS) { - CopyRect(&focus, &lpdis->rcItem); - focus.left += 2; - focus.right -= 2; - focus.top += 1; - focus.bottom -= 1; - DrawFocusRect(lpdis->hDC, &focus); - } - return TRUE; - } - } - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) - EndDialog(hDlg, TRUE); - if (HIWORD(wParam) == BN_DBLCLK) { - if (LOWORD(wParam) == IDC_URL) - ShellExecute(NULL, "open", "http://www.unrealircd.com", NULL, NULL, - SW_MAXIMIZE); - else if (LOWORD(wParam) == IDC_EMAIL) - ShellExecute(NULL, "open", "mailto:unreal-users@lists.sourceforge.net", NULL, NULL, - SW_MAXIMIZE); - EndDialog(hDlg, TRUE); - return 0; - } - break; - case WM_CLOSE: - EndDialog(hDlg, TRUE); - break; - case WM_DESTROY: - DeleteObject(hFont); - break; - - } - return (FALSE); -} - -HWND DrawToolbar(HWND hwndParent, UINT iID) { - HWND hTool; - TBADDBITMAP tbBit; - int newidx; - TBBUTTON tbButtons[10] = { - { STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, - { STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, - { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, - { STD_CUT, IDM_CUT, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, - { STD_COPY, IDM_COPY, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, - { STD_PASTE, IDM_PASTE, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, - { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, - { STD_UNDO, IDM_UNDO, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, - { STD_REDOW, IDM_REDO, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, - { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0} - }; - - TBBUTTON tbAddButtons[7] = { - { 0, IDC_BOLD, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, 0}, - { 1, IDC_UNDERLINE, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, 0}, - { 2, IDC_COLOR, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, - { 3, IDC_BGCOLOR, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, - { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, - { 4, IDC_GOTO, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, - { STD_FIND, IDC_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0} - }; - hTool = CreateToolbarEx(hwndParent, WS_VISIBLE|WS_CHILD|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS, - IDC_TOOLBAR, 0, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, - tbButtons, 10, 0,0,100,30, sizeof(TBBUTTON)); - tbBit.hInst = hInst; - tbBit.nID = IDB_BITMAP1; - newidx = SendMessage(hTool, TB_ADDBITMAP, (WPARAM)5, (LPARAM)&tbBit); - tbAddButtons[0].iBitmap += newidx; - tbAddButtons[1].iBitmap += newidx; - tbAddButtons[2].iBitmap += newidx; - tbAddButtons[3].iBitmap += newidx; - tbAddButtons[5].iBitmap += newidx; - SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)7, (LPARAM)&tbAddButtons); - return hTool; -} - -HWND DrawStatusbar(HWND hwndParent, UINT iID) { - HWND hStatus, hTip; - TOOLINFO ti; - RECT clrect; - hStatus = CreateStatusWindow(WS_CHILD|WS_VISIBLE|SBT_TOOLTIPS, NULL, hwndParent, iID); - hTip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, - WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP, 0, 0, 0, 0, hwndParent, NULL, hInst, NULL); - GetClientRect(hStatus, &clrect); - ti.cbSize = sizeof(TOOLINFO); - ti.uFlags = TTF_SUBCLASS; - ti.hwnd = hStatus; - ti.uId = 1; - ti.hinst = hInst; - ti.rect = clrect; - ti.lpszText = "Go To"; - SendMessage(hTip, TTM_ADDTOOL, 0, (LPARAM)&ti); - return hStatus; - -} - - -LRESULT CALLBACK GotoDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - if (message == WM_COMMAND) { - if (LOWORD(wParam) == IDCANCEL) - EndDialog(hDlg, TRUE); - if (LOWORD(wParam) == IDOK) { - HWND hWnd = GetDlgItem(GetParent(hDlg),IDC_TEXT); - int line = GetDlgItemInt(hDlg, IDC_GOTO, NULL, FALSE); - int pos = SendMessage(hWnd, EM_LINEINDEX, (WPARAM)--line, 0); - SendMessage(hWnd, EM_SETSEL, (WPARAM)pos, (LPARAM)pos); - SendMessage(hWnd, EM_SCROLLCARET, 0, 0); - EndDialog(hDlg, TRUE); - } - } - return FALSE; -} - -LRESULT CALLBACK FromFileDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - HWND hWnd; - static FINDREPLACE find; - static char findbuf[256]; - static unsigned char *file; - static HWND hTool, hClip, hStatus; - static RECT rOld; - CHARFORMAT2 chars; - - if (message == WM_FINDMSGSTRING) - { - FINDREPLACE *fr = (FINDREPLACE *)lParam; - - if (fr->Flags & FR_FINDNEXT) - { - HWND hRich = GetDlgItem(hDlg, IDC_TEXT); - DWORD flags=0; - FINDTEXTEX ft; - CHARRANGE chrg; - - if (fr->Flags & FR_DOWN) - flags |= FR_DOWN; - if (fr->Flags & FR_MATCHCASE) - flags |= FR_MATCHCASE; - if (fr->Flags & FR_WHOLEWORD) - flags |= FR_WHOLEWORD; - ft.lpstrText = fr->lpstrFindWhat; - SendMessage(hRich, EM_EXGETSEL, 0, (LPARAM)&chrg); - if (flags & FR_DOWN) - { - ft.chrg.cpMin = chrg.cpMax; - ft.chrg.cpMax = -1; - } - else - { - ft.chrg.cpMin = chrg.cpMin; - ft.chrg.cpMax = -1; - } - if (SendMessage(hRich, EM_FINDTEXTEX, flags, (LPARAM)&ft) == -1) - { - MessageBox(NULL, "Unreal has finished searching the document", - "Find", MB_ICONINFORMATION|MB_OK); - } - else - { - SendMessage(hRich, EM_EXSETSEL, 0, (LPARAM)&(ft.chrgText)); - SendMessage(hRich, EM_SCROLLCARET, 0, 0); - SetFocus(hRich); - } - } - return TRUE; - } - switch (message) { - case WM_INITDIALOG: { - int fd,len; - unsigned char *buffer = '\0', *string = '\0'; - EDITSTREAM edit; - StreamIO *stream = malloc(sizeof(StreamIO)); - unsigned char szText[256]; - struct stat sb; - HWND hWnd = GetDlgItem(hDlg, IDC_TEXT), hTip; - file = (unsigned char *)lParam; - if (file) - wsprintf(szText, "UnrealIRCd Editor - %s", file); - else - strcpy(szText, "UnrealIRCd Editor - New File"); - SetWindowText(hDlg, szText); - lpfnOldWndProc = (FARPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)RESubClassFunc); - hTool = DrawToolbar(hDlg, IDC_TOOLBAR); - hStatus = DrawStatusbar(hDlg, IDC_STATUS); - SendMessage(hWnd, EM_SETEVENTMASK, 0, (LPARAM)ENM_SELCHANGE); - chars.cbSize = sizeof(CHARFORMAT2); - chars.dwMask = CFM_FACE; - strcpy(chars.szFaceName,"Fixedsys"); - SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_ALL, (LPARAM)&chars); - if ((fd = open(file, _O_RDONLY|_O_BINARY)) != -1) { - fstat(fd,&sb); - /* Only allocate the amount we need */ - buffer = malloc(sb.st_size+1); - buffer[0] = 0; - len = read(fd, buffer, sb.st_size); - buffer[len] = 0; - len = CountRTFSize(buffer)+1; - string = malloc(len); - bzero(string,len); - IRCToRTF(buffer,string); - RTFBuf = string; - len--; - stream->size = &len; - stream->buffer = &RTFBuf; - edit.dwCookie = (UINT)stream; - edit.pfnCallback = SplitIt; - SendMessage(hWnd, EM_EXLIMITTEXT, 0, (LPARAM)0x7FFFFFFF); - SendMessage(hWnd, EM_STREAMIN, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); - SendMessage(hWnd, EM_SETMODIFY, (WPARAM)FALSE, 0); - SendMessage(hWnd, EM_EMPTYUNDOBUFFER, 0, 0); - close(fd); - RTFBuf = NULL; - free(buffer); - free(string); - free(stream); - hClip = SetClipboardViewer(hDlg); - if (SendMessage(hWnd, EM_CANPASTE, 0, 0)) - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(TRUE,0)); - else - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(FALSE,0)); - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(FALSE,0)); - wsprintf(szText, "Line: 1"); - SetWindowText(hStatus, szText); - } - return (TRUE); - } - case WM_WINDOWPOSCHANGING: - { - GetClientRect(hDlg, &rOld); - return FALSE; - } - case WM_SIZE: - { - DWORD new_width, new_height; - HWND hRich; - RECT rOldRich; - DWORD old_width, old_height; - DWORD old_rich_width, old_rich_height; - if (hDlg == hFind) - return FALSE; - new_width = LOWORD(lParam); - new_height = HIWORD(lParam); - hRich = GetDlgItem(hDlg, IDC_TEXT); - SendMessage(hStatus, WM_SIZE, 0, 0); - SendMessage(hTool, TB_AUTOSIZE, 0, 0); - old_width = rOld.right-rOld.left; - old_height = rOld.bottom-rOld.top; - new_width = new_width - old_width; - new_height = new_height - old_height; - GetWindowRect(hRich, &rOldRich); - old_rich_width = rOldRich.right-rOldRich.left; - old_rich_height = rOldRich.bottom-rOldRich.top; - SetWindowPos(hRich, NULL, 0, 0, old_rich_width+new_width, - old_rich_height+new_height, - SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOZORDER); - bzero(&rOld, sizeof(RECT)); - return TRUE; - } - case WM_NOTIFY: - switch (((NMHDR *)lParam)->code) { - case EN_SELCHANGE: { - HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); - DWORD start, end, currline; - static DWORD prevline = 0; - unsigned char buffer[512]; - chars.cbSize = sizeof(CHARFORMAT2); - SendMessage(hWnd, EM_GETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); - if (chars.dwMask & CFM_BOLD && chars.dwEffects & CFE_BOLD) - SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_BOLD, (LPARAM)MAKELONG(TRUE,0)); - else - SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_BOLD, (LPARAM)MAKELONG(FALSE,0)); - if (chars.dwMask & CFM_UNDERLINE && chars.dwEffects & CFE_UNDERLINE) - SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_UNDERLINE, (LPARAM)MAKELONG(TRUE,0)); - else - SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_UNDERLINE, (LPARAM)MAKELONG(FALSE,0)); - SendMessage(hWnd, EM_GETSEL,(WPARAM)&start, (LPARAM)&end); - if (start == end) { - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_COPY, (LPARAM)MAKELONG(FALSE,0)); - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_CUT, (LPARAM)MAKELONG(FALSE,0)); - } - else { - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_COPY, (LPARAM)MAKELONG(TRUE,0)); - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_CUT, (LPARAM)MAKELONG(TRUE,0)); - } - if (SendMessage(hWnd, EM_CANUNDO, 0, 0)) - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(TRUE,0)); - else - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(FALSE,0)); - if (SendMessage(hWnd, EM_CANREDO, 0, 0)) - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_REDO, (LPARAM)MAKELONG(TRUE,0)); - else - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_REDO, (LPARAM)MAKELONG(FALSE,0)); - currline = SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)-1, 0); - currline++; - if (currline != prevline) { - wsprintf(buffer, "Line: %d", currline); - SetWindowText(hStatus, buffer); - prevline = currline; - } - } - return (TRUE); - - case TTN_GETDISPINFO: { - LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam; - lpttt->hinst = NULL; - switch (lpttt->hdr.idFrom) { - case IDM_NEW: - strcpy(lpttt->szText, "New"); - break; - case IDM_SAVE: - strcpy(lpttt->szText, "Save"); - break; - case IDM_CUT: - strcpy(lpttt->szText, "Cut"); - break; - case IDM_COPY: - strcpy(lpttt->szText, "Copy"); - break; - case IDM_PASTE: - strcpy(lpttt->szText, "Paste"); - break; - case IDM_UNDO: - strcpy(lpttt->szText, "Undo"); - break; - case IDM_REDO: - strcpy(lpttt->szText, "Redo"); - break; - case IDC_BOLD: - strcpy(lpttt->szText, "Bold"); - break; - case IDC_UNDERLINE: - strcpy(lpttt->szText, "Underline"); - break; - case IDC_COLOR: - strcpy(lpttt->szText, "Text Color"); - break; - case IDC_BGCOLOR: - strcpy(lpttt->szText, "Background Color"); - break; - case IDC_GOTO: - strcpy(lpttt->szText, "Goto"); - break; - case IDC_FIND: - strcpy(lpttt->szText, "Find"); - break; - } - return (TRUE); - } - case NM_DBLCLK: - DialogBox(hInst, "GOTO", hDlg, (DLGPROC)GotoDLG); - return (TRUE); - } - - return (TRUE); - case WM_COMMAND: - if (LOWORD(wParam) == IDC_BOLD) { - hWnd = GetDlgItem(hDlg, IDC_TEXT); - if (SendMessage(hTool, TB_ISBUTTONCHECKED, (WPARAM)IDC_BOLD, (LPARAM)0) != 0) { - chars.cbSize = sizeof(CHARFORMAT2); - chars.dwMask = CFM_BOLD; - chars.dwEffects = CFE_BOLD; - SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); - SendMessage(hWnd, EM_HIDESELECTION, 0, 0); - SetFocus(hWnd); - } - else { - chars.cbSize = sizeof(CHARFORMAT2); - chars.dwMask = CFM_BOLD; - chars.dwEffects = 0; - SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); - SendMessage(hWnd, EM_HIDESELECTION, 0, 0); - SetFocus(hWnd); - } - return TRUE; - } - else if (LOWORD(wParam) == IDC_UNDERLINE) { - hWnd = GetDlgItem(hDlg, IDC_TEXT); - if (SendMessage(hTool, TB_ISBUTTONCHECKED, (WPARAM)IDC_UNDERLINE, (LPARAM)0) != 0) { - chars.cbSize = sizeof(CHARFORMAT2); - chars.dwMask = CFM_UNDERLINETYPE; - chars.bUnderlineType = CFU_UNDERLINE; - SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); - SendMessage(hWnd, EM_HIDESELECTION, 0, 0); - SetFocus(hWnd); - } - else { - chars.cbSize = sizeof(CHARFORMAT2); - chars.dwMask = CFM_UNDERLINETYPE; - chars.bUnderlineType = CFU_UNDERLINENONE; - SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); - SendMessage(hWnd, EM_HIDESELECTION, 0, 0); - SetFocus(hWnd); - } - return TRUE; - } - if (LOWORD(wParam) == IDC_COLOR) - { - DialogBoxParam(hInst, "Color", hDlg, (DLGPROC)ColorDLG, (LPARAM)WM_USER+10); - return 0; - } - if (LOWORD(wParam) == IDC_BGCOLOR) - { - DialogBoxParam(hInst, "Color", hDlg, (DLGPROC)ColorDLG, (LPARAM)WM_USER+11); - return 0; - } - if (LOWORD(wParam) == IDC_GOTO) - { - DialogBox(hInst, "GOTO", hDlg, (DLGPROC)GotoDLG); - return 0; - } - if (LOWORD(wParam) == IDC_FIND) - { - static FINDREPLACE fr; - bzero(&fr, sizeof(FINDREPLACE)); - fr.lStructSize = sizeof(FINDREPLACE); - fr.hwndOwner = hDlg; - fr.lpstrFindWhat = findbuf; - fr.wFindWhatLen = 255; - hFind = FindText(&fr); - return 0; - } - - hWnd = GetDlgItem(hDlg, IDC_TEXT); - if (LOWORD(wParam) == IDM_COPY) { - SendMessage(hWnd, WM_COPY, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_SELECTALL) { - SendMessage(hWnd, EM_SETSEL, 0, -1); - return 0; - } - if (LOWORD(wParam) == IDM_PASTE) { - SendMessage(hWnd, WM_PASTE, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_CUT) { - SendMessage(hWnd, WM_CUT, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_UNDO) { - SendMessage(hWnd, EM_UNDO, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_REDO) { - SendMessage(hWnd, EM_REDO, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_DELETE) { - SendMessage(hWnd, WM_CLEAR, 0, 0); - return 0; - } - if (LOWORD(wParam) == IDM_SAVE) { - int fd; - EDITSTREAM edit; - OPENFILENAME lpopen; - if (!file) { - unsigned char path[MAX_PATH]; - path[0] = '\0'; - bzero(&lpopen, sizeof(OPENFILENAME)); - lpopen.lStructSize = sizeof(OPENFILENAME); - lpopen.hwndOwner = hDlg; - lpopen.lpstrFilter = NULL; - lpopen.lpstrCustomFilter = NULL; - lpopen.nFilterIndex = 0; - lpopen.lpstrFile = path; - lpopen.nMaxFile = MAX_PATH; - lpopen.lpstrFileTitle = NULL; - lpopen.lpstrInitialDir = DPATH; - lpopen.lpstrTitle = NULL; - lpopen.Flags = (OFN_ENABLESIZING|OFN_NONETWORKBUTTON| - OFN_OVERWRITEPROMPT); - if (GetSaveFileName(&lpopen)) - file = path; - else - break; - } - fd = open(file, _O_TRUNC|_O_CREAT|_O_WRONLY|_O_BINARY,_S_IWRITE); - edit.dwCookie = 0; - edit.pfnCallback = BufferIt; - SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_STREAMOUT, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); - RTFToIRC(fd, RTFBuf, strlen(RTFBuf)); - free(RTFBuf); - RTFBuf = NULL; - SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_SETMODIFY, (WPARAM)FALSE, 0); - - return 0; - } - if (LOWORD(wParam) == IDM_NEW) { - unsigned char text[1024]; - BOOL newfile = FALSE; - int ans; - if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_GETMODIFY, 0, 0) != 0) { - sprintf(text, "The text in the %s file has changed.\r\n\r\nDo you want to save the changes?", file ? file : "new"); - ans = MessageBox(hDlg, text, "UnrealIRCd", MB_YESNOCANCEL|MB_ICONWARNING); - if (ans == IDNO) - newfile = TRUE; - if (ans == IDCANCEL) - return TRUE; - if (ans == IDYES) { - SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDM_SAVE,0), 0); - newfile = TRUE; - } - } - else - newfile = TRUE; - if (newfile == TRUE) { - unsigned char szText[256]; - file = NULL; - strcpy(szText, "UnrealIRCd Editor - New File"); - SetWindowText(hDlg, szText); - SetWindowText(GetDlgItem(hDlg, IDC_TEXT), NULL); - } - - break; - } - break; - case WM_USER+10: { - HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); - EndDialog((HWND)lParam, TRUE); - chars.cbSize = sizeof(CHARFORMAT2); - chars.dwMask = CFM_COLOR; - chars.crTextColor = (COLORREF)wParam; - SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); - SendMessage(hWnd, EM_HIDESELECTION, 0, 0); - SetFocus(hWnd); - break; - } - case WM_USER+11: { - HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); - EndDialog((HWND)lParam, TRUE); - chars.cbSize = sizeof(CHARFORMAT2); - chars.dwMask = CFM_BACKCOLOR; - chars.crBackColor = (COLORREF)wParam; - SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); - SendMessage(hWnd, EM_HIDESELECTION, 0, 0); - SetFocus(hWnd); - break; - } - case WM_CHANGECBCHAIN: - if ((HWND)wParam == hClip) - hClip = (HWND)lParam; - else - SendMessage(hClip, WM_CHANGECBCHAIN, wParam, lParam); - break; - case WM_DRAWCLIPBOARD: - if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_CANPASTE, 0, 0)) - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(TRUE,0)); - else - SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(FALSE,0)); - SendMessage(hClip, WM_DRAWCLIPBOARD, wParam, lParam); - break; - case WM_CLOSE: { - unsigned char text[256]; - int ans; - if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_GETMODIFY, 0, 0) != 0) { - sprintf(text, "The text in the %s file has changed.\r\n\r\nDo you want to save the changes?", file ? file : "new"); - ans = MessageBox(hDlg, text, "UnrealIRCd", MB_YESNOCANCEL|MB_ICONWARNING); - if (ans == IDNO) - EndDialog(hDlg, TRUE); - if (ans == IDCANCEL) - return TRUE; - if (ans == IDYES) { - SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDM_SAVE,0), 0); - EndDialog(hDlg, TRUE); - } - } - else - EndDialog(hDlg, TRUE); - break; - } - case WM_DESTROY: - ChangeClipboardChain(hDlg, hClip); - break; - } - - return (FALSE); -} - -LRESULT CALLBACK StatusDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) { - case WM_INITDIALOG: { - hwTreeView = GetDlgItem(hDlg, IDC_TREE); - win_map(&me, hwTreeView, 0); - SetDlgItemInt(hDlg, IDC_CLIENTS, IRCstats.clients, FALSE); - SetDlgItemInt(hDlg, IDC_SERVERS, IRCstats.servers, FALSE); - SetDlgItemInt(hDlg, IDC_INVISO, IRCstats.invisible, FALSE); - SetDlgItemInt(hDlg, IDC_UNKNOWN, IRCstats.unknown, FALSE); - SetDlgItemInt(hDlg, IDC_OPERS, IRCstats.operators, FALSE); - SetDlgItemInt(hDlg, IDC_CHANNELS, IRCstats.channels, FALSE); - if (IRCstats.clients > IRCstats.global_max) - IRCstats.global_max = IRCstats.clients; - if (IRCstats.me_clients > IRCstats.me_max) - IRCstats.me_max = IRCstats.me_clients; - SetDlgItemInt(hDlg, IDC_MAXCLIENTS, IRCstats.global_max, FALSE); - SetDlgItemInt(hDlg, IDC_LCLIENTS, IRCstats.me_clients, FALSE); - SetDlgItemInt(hDlg, IDC_LSERVERS, IRCstats.me_servers, FALSE); - SetDlgItemInt(hDlg, IDC_LMAXCLIENTS, IRCstats.me_max, FALSE); - SetTimer(hDlg, 1, 5000, NULL); - return (TRUE); - } - case WM_CLOSE: - DestroyWindow(hDlg); - return TRUE; - case WM_TIMER: - TreeView_DeleteAllItems(hwTreeView); - win_map(&me, hwTreeView, 1); - SetDlgItemInt(hDlg, IDC_CLIENTS, IRCstats.clients, FALSE); - SetDlgItemInt(hDlg, IDC_SERVERS, IRCstats.servers, FALSE); - SetDlgItemInt(hDlg, IDC_INVISO, IRCstats.invisible, FALSE); - SetDlgItemInt(hDlg, IDC_INVISO, IRCstats.invisible, FALSE); - SetDlgItemInt(hDlg, IDC_UNKNOWN, IRCstats.unknown, FALSE); - SetDlgItemInt(hDlg, IDC_OPERS, IRCstats.operators, FALSE); - SetDlgItemInt(hDlg, IDC_CHANNELS, IRCstats.channels, FALSE); - if (IRCstats.clients > IRCstats.global_max) - IRCstats.global_max = IRCstats.clients; - if (IRCstats.me_clients > IRCstats.me_max) - IRCstats.me_max = IRCstats.me_clients; - SetDlgItemInt(hDlg, IDC_MAXCLIENTS, IRCstats.global_max, FALSE); - SetDlgItemInt(hDlg, IDC_LCLIENTS, IRCstats.me_clients, FALSE); - SetDlgItemInt(hDlg, IDC_LSERVERS, IRCstats.me_servers, FALSE); - SetDlgItemInt(hDlg, IDC_LMAXCLIENTS, IRCstats.me_max, FALSE); - SetTimer(hDlg, 1, 5000, NULL); - return (TRUE); - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) { - DestroyWindow(hDlg); - return TRUE; - } - break; - - } - return (FALSE); -} - -LRESULT CALLBACK ColorDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - static HBRUSH hBrushWhite, hBrushBlack, hBrushDarkBlue, hBrushDarkGreen, hBrushRed, - hBrushDarkRed, hBrushPurple, hBrushOrange, hBrushYellow, hBrushGreen, hBrushVDarkGreen, - hBrushLightBlue, hBrushBlue, hBrushPink, hBrushDarkGray, hBrushGray; - static UINT ResultMsg=0; - switch (message) { - case WM_INITDIALOG: - hBrushWhite = CreateSolidBrush(RGB(255,255,255)); - hBrushBlack = CreateSolidBrush(RGB(0,0,0)); - hBrushDarkBlue = CreateSolidBrush(RGB(0,0,127)); - hBrushDarkGreen = CreateSolidBrush(RGB(0,147,0)); - hBrushRed = CreateSolidBrush(RGB(255,0,0)); - hBrushDarkRed = CreateSolidBrush(RGB(127,0,0)); - hBrushPurple = CreateSolidBrush(RGB(156,0,156)); - hBrushOrange = CreateSolidBrush(RGB(252,127,0)); - hBrushYellow = CreateSolidBrush(RGB(255,255,0)); - hBrushGreen = CreateSolidBrush(RGB(0,252,0)); - hBrushVDarkGreen = CreateSolidBrush(RGB(0,147,147)); - hBrushLightBlue = CreateSolidBrush(RGB(0,255,255)); - hBrushBlue = CreateSolidBrush(RGB(0,0,252)); - hBrushPink = CreateSolidBrush(RGB(255,0,255)); - hBrushDarkGray = CreateSolidBrush(RGB(127,127,127)); - hBrushGray = CreateSolidBrush(RGB(210,210,210)); - ResultMsg = (UINT)lParam; - SetFocus(NULL); - return (TRUE); - case WM_DRAWITEM: { - LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam; - if (wParam == IDC_WHITE) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushWhite); - } - if (wParam == IDC_BLACK) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushBlack); - } - if (wParam == IDC_DARKBLUE) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkBlue); - } - if (wParam == IDC_DARKGREEN) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkGreen); - } - if (wParam == IDC_RED) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushRed); - } - if (wParam == IDC_DARKRED) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkRed); - } - if (wParam == IDC_PURPLE) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushPurple); - } - if (wParam == IDC_ORANGE) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushOrange); - } - if (wParam == IDC_YELLOW) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushYellow); - } - if (wParam == IDC_GREEN) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushGreen); - } - if (wParam == IDC_VDARKGREEN) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushVDarkGreen); - } - if (wParam == IDC_LIGHTBLUE) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushLightBlue); - } - if (wParam == IDC_BLUE) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushBlue); - } - if (wParam == IDC_PINK) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushPink); - } - if (wParam == IDC_DARKGRAY) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkGray); - } - if (wParam == IDC_GRAY) { - FillRect(lpdis->hDC, &lpdis->rcItem, hBrushGray); - } - DrawEdge(lpdis->hDC, &lpdis->rcItem, EDGE_SUNKEN, BF_RECT); - return TRUE; - } - case WM_COMMAND: { - COLORREF clrref; - if (LOWORD(wParam) == IDC_WHITE) - clrref = RGB(255,255,255); - else if (LOWORD(wParam) == IDC_BLACK) - clrref = RGB(0,0,0); - else if (LOWORD(wParam) == IDC_DARKBLUE) - clrref = RGB(0,0,127); - else if (LOWORD(wParam) == IDC_DARKGREEN) - clrref = RGB(0,147,0); - else if (LOWORD(wParam) == IDC_RED) - clrref = RGB(255,0,0); - else if (LOWORD(wParam) == IDC_DARKRED) - clrref = RGB(127,0,0); - else if (LOWORD(wParam) == IDC_PURPLE) - clrref = RGB(156,0,156); - else if (LOWORD(wParam) == IDC_ORANGE) - clrref = RGB(252,127,0); - else if (LOWORD(wParam) == IDC_YELLOW) - clrref = RGB(255,255,0); - else if (LOWORD(wParam) == IDC_GREEN) - clrref = RGB(0,252,0); - else if (LOWORD(wParam) == IDC_VDARKGREEN) - clrref = RGB(0,147,147); - else if (LOWORD(wParam) == IDC_LIGHTBLUE) - clrref = RGB(0,255,255); - else if (LOWORD(wParam) == IDC_BLUE) - clrref = RGB(0,0,252); - else if (LOWORD(wParam) == IDC_PINK) - clrref = RGB(255,0,255); - else if (LOWORD(wParam) == IDC_DARKGRAY) - clrref = RGB(127,127,127); - else if (LOWORD(wParam) == IDC_GRAY) - clrref = RGB(210,210,210); - SendMessage(GetParent(hDlg), ResultMsg, (WPARAM)clrref, (LPARAM)hDlg); - } - - break; - case WM_CLOSE: - EndDialog(hDlg, TRUE); - case WM_DESTROY: - DeleteObject(hBrushWhite); - DeleteObject(hBrushBlack); - DeleteObject(hBrushDarkBlue); - DeleteObject(hBrushDarkGreen); - DeleteObject(hBrushRed); - DeleteObject(hBrushDarkRed); - DeleteObject(hBrushPurple); - DeleteObject(hBrushOrange); - DeleteObject(hBrushYellow); - DeleteObject(hBrushGreen); - DeleteObject(hBrushVDarkGreen); - DeleteObject(hBrushLightBlue); - DeleteObject(hBrushBlue); - DeleteObject(hBrushPink); - DeleteObject(hBrushDarkGray); - DeleteObject(hBrushGray); - break; - } - - return (FALSE); -} - - -/* find how big a buffer expansion we need for RTF transformation */ -int CountRTFSize(unsigned char *buffer) { - int size = 0; - char bold = 0, uline = 0, incolor = 0, inbg = 0, reverse = 0; - char *buf = buffer; - - for (; *buf; buf++) - { - if (*buf == '{' || *buf == '}' || *buf == '\\') - size++; - else if (*buf == '\r') - { - if (*(buf+1) && *(buf+1) == '\n') - { - buf++; - if (bold) - size += 3; - if (uline) - size += 7; - if (incolor && !reverse) - size += 4; - if (inbg && !reverse) - size += 11; - if (reverse) - size += 15; - if (bold || uline || incolor || inbg || reverse) - size++; - bold = uline = incolor = inbg = reverse = 0; - size +=6; - continue; - } - } - else if (*buf == '\n') - { - if (bold) - size += 3; - if (uline) - size += 7; - if (incolor && !reverse) - size += 4; - if (inbg && !reverse) - size += 11; - if (reverse) - size += 15; - if (bold || uline || incolor || inbg || reverse) - size++; - bold = uline = incolor = inbg = reverse = 0; - size +=6; - continue; - } - else if (*buf == '\2') - { - if (bold) - size += 4; - else - size += 3; - bold = !bold; - continue; - } - else if (*buf == '\3' && reverse) - { - if (*(buf+1) && isdigit(*(buf+1))) - { - ++buf; - if (*(buf+1) && isdigit(*(buf+1))) - ++buf; - if (*(buf+1) && *(buf+1) == ',') - { - if (*(buf+2) && isdigit(*(buf+2))) - { - buf+=2; - if (*(buf+1) && isdigit(*(buf+1))) - ++buf; - } - } - } - continue; - } - else if (*buf == '\3' && !reverse) - { - size += 3; - if (*(buf+1) && !isdigit(*(buf+1))) - { - incolor = 0; - size++; - if (inbg) - { - inbg = 0; - size += 11; - } - } - else if (*(buf+1)) - { - unsigned char color[3]; - int number; - color[0] = *(++buf); - color[1] = 0; - if (*(buf+1) && isdigit(*(buf+1))) - color[1] = *(++buf); - color[2] = 0; - number = atoi(color); - if (number == 99 || number == 1) - size += 2; - else if (number == 0) - size++; - else { - number %= 16; - _itoa(number, color, 10); - size += strlen(color); - } - color[2] = 0; - number = atoi(color); - if (*(buf+1) && *(buf+1) == ',') - { - if (*(buf+2) && isdigit(*(buf+2))) - { - size += 10; - buf++; - color[0] = *(++buf); - color[1] = 0; - if (*(buf+1) && isdigit(*(buf+1))) - color[1] = *(++buf); - color[2] = 0; - number = atoi(color); - if (number == 1) - size += 2; - else if (number == 0 || number == 99) - size++; - else - { - number %= 16; - _itoa(number, color, 10); - size += strlen(color); - } - inbg = 1; - } - } - incolor = 1; - } - size++; - continue; - } - else if (*buf == '\17') - { - if (bold) - size += 3; - if (uline) - size += 7; - if (incolor && !reverse) - size += 4; - if (inbg && !reverse) - size += 11; - if (reverse) - size += 15; - if (bold || uline || incolor || inbg || reverse) - size++; - bold = uline = incolor = inbg = reverse = 0; - continue; - } - else if (*buf == '\26') - { - if (reverse) - size += 16; - else - size += 17; - reverse = !reverse; - continue; - } - else if (*buf == '\37') - { - if (uline) - size += 8; - else - size += 4; - uline = !uline; - continue; - } - size++; - } - size+=strlen("{\\rtf1\\ansi\\ansicpg1252\\deff0{\\fonttbl{\\f0\\fmodern\\fprq1\\" - "fcharset0 Fixedsys;}}\r\n" - MIRC_COLORS - "\\viewkind4\\uc1\\pard\\lang1033\\f0\\fs20")+1; - return (size); -} - -void IRCToRTF(unsigned char *buffer, unsigned char *string) { - unsigned char *tmp; - int i = 0; - short bold = 0, uline = 0, incolor = 0, inbg = 0, reverse = 0; - sprintf(string, "{\\rtf1\\ansi\\ansicpg1252\\deff0{\\fonttbl{\\f0\\fmodern\\fprq1\\" - "fcharset0 Fixedsys;}}\r\n" - MIRC_COLORS - "\\viewkind4\\uc1\\pard\\lang1033\\f0\\fs20"); - i = strlen(string); - for (tmp = buffer; *tmp; tmp++) - { - if (*tmp == '{') - { - strcat(string, "\\{"); - i+=2; - continue; - } - else if (*tmp == '}') - { - strcat(string, "\\}"); - i+=2; - continue; - } - else if (*tmp == '\\') - { - strcat(string, "\\\\"); - i+=2; - continue; - } - else if (*tmp == '\r') - { - if (*(tmp+1) && *(tmp+1) == '\n') - { - tmp++; - if (bold) - { - strcat(string, "\\b0 "); - i+=3; - } - if (uline) - { - strcat(string, "\\ulnone"); - i+=7; - } - if (incolor && !reverse) - { - strcat(string, "\\cf0"); - i+=4; - } - if (inbg && !reverse) - { - strcat(string, "\\highlight0"); - i +=11; - } - if (reverse) { - strcat(string, "\\cf0\\highlight0"); - i += 15; - } - if (bold || uline || incolor || inbg || reverse) - string[i++] = ' '; - bold = uline = incolor = inbg = reverse = 0; - strcat(string, "\\par\r\n"); - i +=6; - } - else - string[i++]='\r'; - continue; - } - else if (*tmp == '\n') - { - if (bold) - { - strcat(string, "\\b0 "); - i+=3; - } - if (uline) - { - strcat(string, "\\ulnone"); - i+=7; - } - if (incolor && !reverse) - { - strcat(string, "\\cf0"); - i+=4; - } - if (inbg && !reverse) - { - strcat(string, "\\highlight0"); - i +=11; - } - if (reverse) { - strcat(string, "\\cf0\\highlight0"); - i += 15; - } - if (bold || uline || incolor || inbg || reverse) - string[i++] = ' '; - bold = uline = incolor = inbg = reverse = 0; - strcat(string, "\\par\r\n"); - i +=6; - continue; - } - else if (*tmp == '\2') - { - if (bold) - { - strcat(string, "\\b0 "); - i+=4; - } - else - { - strcat(string, "\\b "); - i+=3; - } - bold = !bold; - continue; - } - else if (*tmp == '\3' && reverse) - { - if (*(tmp+1) && isdigit(*(tmp+1))) - { - ++tmp; - if (*(tmp+1) && isdigit(*(tmp+1))) - ++tmp; - if (*(tmp+1) && *(tmp+1) == ',') - { - if (*(tmp+2) && isdigit(*(tmp+2))) - { - tmp+=2; - if (*(tmp+1) && isdigit(*(tmp+1))) - ++tmp; - } - } - } - continue; - } - else if (*tmp == '\3' && !reverse) - { - strcat(string, "\\cf"); - i += 3; - if (*(tmp+1) && !isdigit(*(tmp+1))) - { - incolor = 0; - string[i++] = '0'; - if (inbg) - { - inbg = 0; - strcat(string, "\\highlight0"); - i += 11; - } - } - else if (*(tmp+1)) - { - unsigned char color[3]; - int number; - color[0] = *(++tmp); - color[1] = 0; - if (*(tmp+1) && isdigit(*(tmp+1))) - color[1] = *(++tmp); - color[2] = 0; - number = atoi(color); - if (number == 99 || number == 1) - { - strcat(string, "16"); - i += 2; - } - else if (number == 0) - { - strcat(string, "1"); - i++; - } - else - { - number %= 16; - _itoa(number, color, 10); - strcat(string, color); - i += strlen(color); - } - if (*(tmp+1) && *(tmp+1) == ',') - { - if (*(tmp+2) && isdigit(*(tmp+2))) - { - strcat(string, "\\highlight"); - i += 10; - tmp++; - color[0] = *(++tmp); - color[1] = 0; - if (*(tmp+1) && isdigit(*(tmp+1))) - color[1] = *(++tmp); - color[2] = 0; - number = atoi(color); - if (number == 1) - { - strcat(string, "16"); - i += 2; - } - else if (number == 0 || number == 99) - string[i++] = '1'; - else - { - number %= 16; - _itoa(number, color, 10); - strcat(string,color); - i += strlen(color); - } - inbg = 1; - } - } - incolor=1; - } - string[i++] = ' '; - continue; - } - else if (*tmp == '\17') { - if (uline) { - strcat(string, "\\ulnone"); - i += 7; - } - if (bold) { - strcat(string, "\\b0"); - i += 3; - } - if (incolor && !reverse) { - strcat(string, "\\cf0"); - i += 4; - } - if (inbg && !reverse) - { - strcat(string, "\\highlight0"); - i += 11; - } - if (reverse) { - strcat(string, "\\cf0\\highlight0"); - i += 15; - } - if (uline || bold || incolor || inbg || reverse) - string[i++] = ' '; - uline = bold = incolor = inbg = reverse = 0; - continue; - } - else if (*tmp == '\26') - { - if (reverse) - { - strcat(string, "\\cf0\\highlight0 "); - i += 16; - } - else - { - strcat(string, "\\cf1\\highlight16 "); - i += 17; - } - reverse = !reverse; - continue; - } - - else if (*tmp == '\37') { - if (uline) { - strcat(string, "\\ulnone "); - i += 8; - } - else { - strcat(string, "\\ul "); - i += 4; - } - uline = !uline; - continue; - } - string[i++] = *tmp; - } - strcat(string, "}"); - return; -} - -/* This was made by DrBin but I cleaned it up a bunch to make it work better */ - -HTREEITEM AddItemToTree(HWND hWnd, LPSTR lpszItem, int nLevel, short remap) -{ - TVITEM tvi; - TVINSERTSTRUCT tvins; - static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; - static HTREEITEM hPrevLev[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; - HTREEITEM hti; - if (remap) { - hPrev = (HTREEITEM)TVI_FIRST; - memset(hPrevLev, 0, sizeof(HTREEITEM)*10); - } - - tvi.mask = TVIF_TEXT|TVIF_PARAM; - tvi.pszText = lpszItem; - tvi.cchTextMax = lstrlen(lpszItem); - tvi.lParam = (LPARAM)nLevel; - tvins.item = tvi; - tvins.hInsertAfter = hPrev; - if (nLevel == 1) - tvins.hParent = TVI_ROOT; - else - tvins.hParent = hPrevLev[nLevel-1]; - hPrev = (HTREEITEM)SendMessage(hWnd, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT) &tvins); - hPrevLev[nLevel] = hPrev; - TreeView_EnsureVisible(hWnd,hPrev); - if (nLevel > 1) { - hti = TreeView_GetParent(hWnd, hPrev); - tvi.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE; - tvi.hItem = hti; - TreeView_SetItem(hWnd, &tvi); - } - return hPrev; -} - -/* - * Now used to create list of servers for server list tree view -- David Flynn - * Recoded by codemastr to be faster. - * I removed the Potvin credit because it no longer uses any original code and I don't - * even think Potvin actually made the original code - */ -void win_map(aClient *server, HWND hwTreeView, short remap) -{ - aClient *acptr; - Link *lp; - AddItemToTree(hwTreeView,server->name,server->hopcount+1, remap); - for (lp = Servers; lp; lp = lp->next) - { - acptr = lp->value.cptr; - if (acptr->srvptr != server) - continue; - win_map(acptr, hwTreeView, 0); - } -} - -/* ugly stuff, but hey it works -- codemastr */ -void win_log(unsigned char *format, ...) { - va_list ap; - unsigned char buf[2048]; - unsigned char *buf2; - va_start(ap, format); - ircvsprintf(buf, format, ap); - if (!IsService) { - strcat(buf, "\r\n"); - if (errors) { - buf2 = MyMalloc(strlen(errors)+strlen(buf)+1); - sprintf(buf2, "%s%s",errors,buf); - MyFree(errors); - errors = NULL; - } - else { - buf2 = MyMalloc(strlen(buf)+1); - sprintf(buf2, "%s",buf); - } - errors = buf2; - } - else { - FILE *fd = fopen("service.log", "a"); - fprintf(fd, "%s\n", buf); - fclose(fd); - } - va_end(ap); -} - -void win_error() { - if (errors && !IsService) - DialogBox(hInst, "ConfigError", hwIRCDWnd, (DLGPROC)ConfigErrorDLG); -} - -LRESULT CALLBACK ConfigErrorDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) { - case WM_INITDIALOG: - MessageBeep(MB_ICONEXCLAMATION); - SetDlgItemText(hDlg, IDC_CONFIGERROR, errors); - MyFree(errors); - errors = NULL; - return (TRUE); - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) - EndDialog(hDlg, TRUE); - break; - case WM_CLOSE: - EndDialog(hDlg, TRUE); - break; - case WM_DESTROY: - break; - - } - return (FALSE); -} diff --git a/src/win32/debug.c b/src/win32/debug.c index 6a6d45624..9c7a98eb9 100644 --- a/src/win32/debug.c +++ b/src/win32/debug.c @@ -1,6 +1,6 @@ /************************************************************************ * IRC - Internet Relay Chat, win32/debug.c - * Copyright (C) 2002 Dominick Meglio (codemastr) + * Copyright (C) 2002-2004 Dominick Meglio (codemastr) * * 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 @@ -33,16 +33,24 @@ #define IRCDTOTALVERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 PATCH5 PATCH6 PATCH7 PATCH8 PATCH9 #endif #define BUFFERSIZE 0x200 + extern OSVERSIONINFO VerInfo; extern char OSName[256]; extern char backupbuf[8192]; extern char *buildid; extern char serveropts[]; extern char *extraflags; -void CleanUp(void); extern BOOL IsService; +void CleanUp(void); -__inline char *StackTrace(EXCEPTION_POINTERS *e) { +/* Runs a stack trace + * Parameters: + * e - The exception information + * Returns: + * The stack trace with function and line number information + */ +__inline char *StackTrace(EXCEPTION_POINTERS *e) +{ static char buffer[5000]; char curmodule[32]; DWORD symOptions, dwDisp, frame; @@ -51,6 +59,8 @@ __inline char *StackTrace(EXCEPTION_POINTERS *e) { IMAGEHLP_LINE pLine; IMAGEHLP_MODULE pMod; STACKFRAME Stack; + + /* Load the stack information */ Stack.AddrPC.Offset = e->ContextRecord->Eip; Stack.AddrPC.Mode = AddrModeFlat; Stack.AddrFrame.Offset = e->ContextRecord->Ebp; @@ -60,6 +70,7 @@ __inline char *StackTrace(EXCEPTION_POINTERS *e) { else hProcess = GetCurrentProcess(); + /* Initialize symbol retrieval system */ SymInitialize(hProcess, NULL, TRUE); SymSetOptions(SYMOPT_LOAD_LINES|SYMOPT_UNDNAME); bzero(pSym, sizeof(IMAGEHLP_SYMBOL)+500); @@ -69,69 +80,65 @@ __inline char *StackTrace(EXCEPTION_POINTERS *e) { pLine.SizeOfStruct = sizeof(IMAGEHLP_LINE); bzero(&pMod, sizeof(IMAGEHLP_MODULE)); pMod.SizeOfStruct = sizeof(IMAGEHLP_MODULE); + + /* Retrieve the first module name */ SymGetModuleInfo(hProcess, Stack.AddrPC.Offset, &pMod); strcpy(curmodule, pMod.ModuleName); sprintf(buffer, "\tModule: %s\n", pMod.ModuleName); - for (frame = 0; ; frame++) { + + /* Walk through the stack */ + for (frame = 0; ; frame++) + { char buf[500]; if (!StackWalk(IMAGE_FILE_MACHINE_I386, GetCurrentProcess(), GetCurrentThread(), &Stack, NULL, NULL, SymFunctionTableAccess, SymGetModuleBase, NULL)) break; SymGetModuleInfo(hProcess, Stack.AddrPC.Offset, &pMod); - if (strcmp(curmodule, pMod.ModuleName)) { + if (strcmp(curmodule, pMod.ModuleName)) + { strcpy(curmodule, pMod.ModuleName); sprintf(buf, "\tModule: %s\n", pMod.ModuleName); strcat(buffer, buf); } SymGetLineFromAddr(hProcess, Stack.AddrPC.Offset, &dwDisp, &pLine); SymGetSymFromAddr(hProcess, Stack.AddrPC.Offset, &dwDisp, pSym); - sprintf(buf, "\t\t#%d %s:%d: %s\n", frame, pLine.FileName, pLine.LineNumber, pSym->Name); + sprintf(buf, "\t\t#%d %s:%d: %s\n", frame, pLine.FileName, pLine.LineNumber, + pSym->Name); strcat(buffer, buf); } return buffer; } -__inline char *GetRegisters(CONTEXT *context) { +/* Retrieves the values of several registers + * Parameters: + * context - The CPU context + * Returns: + * The values of the EAX/EBX/ECX/EDX/ESI/EDI/EIP/EBP/ESP registers + */ +__inline char *GetRegisters(CONTEXT *context) +{ static char buffer[1024]; + sprintf(buffer, "\tEAX=0x%08x EBX=0x%08x ECX=0x%08x\n" "\tEDX=0x%08x ESI=0x%08x EDI=0x%08x\n" "\tEIP=0x%08x EBP=0x%08x ESP=0x%08x\n", - context->Eax, context->Ebx, context->Ecx, context->Edx, - context->Esi, context->Edi, context->Eip, context->Ebp, - context->Esp); + context->Eax, context->Ebx, context->Ecx, context->Edx, + context->Esi, context->Edi, context->Eip, context->Ebp, + context->Esp); return buffer; } -/*__inline char *GetCpuName() { - static char cpuname[48]; - __try { - _asm { - mov eax,080000002h - CPUID - mov DWORD PTR [cpuname+0],eax - mov DWORD PTR [cpuname+4],ebx - mov DWORD PTR [cpuname+8],ecx - mov DWORD PTR [cpuname+12],edx - mov eax,080000003h - CPUID - mov DWORD PTR [cpuname+16],eax - mov DWORD PTR [cpuname+20],ebx - mov DWORD PTR [cpuname+24],ecx - mov DWORD PTR [cpuname+28],edx - mov eax,080000004h - CPUID - mov DWORD PTR [cpuname+32],eax - mov DWORD PTR [cpuname+36],ebx - mov DWORD PTR [cpuname+40],ecx - mov DWORD PTR [cpuname+44],edx - } - } __except(EXCEPTION_EXECUTE_HANDLER) { return NULL; } - return cpuname; -}*/ - -__inline char *GetException(DWORD code) { - switch (code) { +/* Convert the exception code to a human readable string + * Parameters: + * code - The exception code to convert + * Returns: + * The exception code represented as a string + */ +__inline char *GetException(DWORD code) +{ + switch (code) + { case EXCEPTION_ACCESS_VIOLATION: return "Access Violation"; case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: @@ -172,46 +179,69 @@ __inline char *GetException(DWORD code) { return "Single Step"; case EXCEPTION_STACK_OVERFLOW: return "Stack Overflow"; + default: + return "Unknown Exception"; } - return "Unknown Exception"; } - -LONG __stdcall ExceptionFilter(EXCEPTION_POINTERS *e) { +/* Callback for the exception handler + * Parameters: + * e - The exception information + * Returns: + * EXCEPTION_EXECUTE_HANDLER to terminate the process + * Side Effects: + * wircd.PID.core is created + * If not running in service mode, a message box is displayed, + * else output is written to service.log + */ +LONG __stdcall ExceptionFilter(EXCEPTION_POINTERS *e) +{ MEMORYSTATUS memStats; char file[512], text[1024]; FILE *fd; time_t timet = time(NULL); + sprintf(file, "wircd.%d.core", getpid()); fd = fopen(file, "w"); GlobalMemoryStatus(&memStats); - fprintf(fd, "Generated at %s\n%s (%d.%d.%d)\n%s[%s%s%s] (%s)\n-----------------\nMemory Information:\n" - "\tPhysical: (Available:%ldMB/Total:%ldMB)\n\tVirtual: (Available:%ldMB/Total:%ldMB)\n" - "-----------------\nException:\n\t%s\n-----------------\nBackup Buffer:\n\t%s\n" - "-----------------\nRegisters:\n%s-----------------\nStack Trace:\n%s", asctime(gmtime(&timet)), - OSName, VerInfo.dwMajorVersion, VerInfo.dwMinorVersion, VerInfo.dwBuildNumber, - IRCDTOTALVERSION, serveropts, extraflags ? extraflags : "", tainted ? "3" : "", - buildid, memStats.dwAvailPhys/1048576, memStats.dwTotalPhys/1048576, - memStats.dwAvailVirtual/1048576, memStats.dwTotalVirtual/1048576, - GetException(e->ExceptionRecord->ExceptionCode), backupbuf, - GetRegisters(e->ContextRecord), StackTrace(e)); + fprintf(fd, "Generated at %s\n%s (%d.%d.%d)\n%s[%s%s%s] (%s)\n" + "-----------------\nMemory Information:\n" + "\tPhysical: (Available:%ldMB/Total:%ldMB)\n" + "\tVirtual: (Available:%ldMB/Total:%ldMB)\n" + "-----------------\nException:\n\t%s\n-----------------\n" + "Backup Buffer:\n\t%s\n-----------------\nRegisters:\n" + "%s-----------------\nStack Trace:\n%s", + asctime(gmtime(&timet)), OSName, VerInfo.dwMajorVersion, + VerInfo.dwMinorVersion, VerInfo.dwBuildNumber, IRCDTOTALVERSION, + serveropts, extraflags ? extraflags : "", tainted ? "3" : "", + buildid, memStats.dwAvailPhys/1048576, memStats.dwTotalPhys/1048576, + memStats.dwAvailVirtual/1048576, memStats.dwTotalVirtual/1048576, + GetException(e->ExceptionRecord->ExceptionCode), backupbuf, + GetRegisters(e->ContextRecord), StackTrace(e)); + sprintf(text, "UnrealIRCd has encountered a fatal error. Debugging information has" - " been dumped to wircd.%d.core, please email this file to coders@lists.unrealircd.org.", - getpid()); + " been dumped to wircd.%d.core, please email this file to " + "coders@lists.unrealircd.org.", getpid()); fclose(fd); + if (!IsService) MessageBox(NULL, text, "Fatal Error", MB_OK); - else { + else + { FILE *fd = fopen("service.log", "a"); - fprintf(fd, "UnrealIRCd has encountered a fatal error. Debugging information has" - " been dumped to wircd.%d.core, please email this file to coders@lists.unrealircd.org.", getpid()); + + fprintf(fd, "UnrealIRCd has encountered a fatal error. Debugging information " + "has been dumped to wircd.%d.core, please email this file to " + "coders@lists.unrealircd.org.", getpid()); fclose(fd); } CleanUp(); return EXCEPTION_EXECUTE_HANDLER; } -void InitDebug(void) { +/* Initializes the exception handler */ +void InitDebug(void) +{ SetUnhandledExceptionFilter(&ExceptionFilter); } diff --git a/src/win32/editor.c b/src/win32/editor.c new file mode 100644 index 000000000..9b9ee3656 --- /dev/null +++ b/src/win32/editor.c @@ -0,0 +1,777 @@ +/************************************************************************ + * IRC - Internet Relay Chat, win32/editor.c + * Copyright (C) 2004 Dominick Meglio (codemastr) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "setup.h" +#include "win32.h" +#include "sys.h" + +LRESULT CALLBACK GotoDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK ColorDLG(HWND, UINT, WPARAM, LPARAM); + +HWND hFind; + +/* Draws the statusbar for the editor + * Parameters: + * hInstance - The instance to create the statusbar in + * hwndParent - The parent of the statusbar + * iId - The message value used to send messages to the parent + * Returns: + * The handle to the statusbar + */ +HWND DrawStatusbar(HINSTANCE hInstance, HWND hwndParent, UINT iId) +{ + HWND hStatus, hTip; + TOOLINFO ti; + RECT clrect; + hStatus = CreateStatusWindow(WS_CHILD|WS_VISIBLE|SBT_TOOLTIPS, NULL, hwndParent, iId); + hTip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, + WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP, 0, 0, 0, 0, hwndParent, NULL, hInstance, NULL); + GetClientRect(hStatus, &clrect); + ti.cbSize = sizeof(TOOLINFO); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hStatus; + ti.uId = 1; + ti.hinst = hInstance; + ti.rect = clrect; + ti.lpszText = "Go To"; + SendMessage(hTip, TTM_ADDTOOL, 0, (LPARAM)&ti); + return hStatus; +} + +/* Draws the toolbar for the editor + * Parameters: + * hInstance - The instance to create the toolbar in + * hwndParent - The parent of the toolbar + * Returns: + * The handle to the toolbar + */ +HWND DrawToolbar(HINSTANCE hInstance, HWND hwndParent) +{ + HWND hTool; + TBADDBITMAP tbBit; + int newidx; + TBBUTTON tbButtons[10] = { + { STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, + { STD_CUT, IDM_CUT, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_COPY, IDM_COPY, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_PASTE, IDM_PASTE, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, + { STD_UNDO, IDM_UNDO, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_REDOW, IDM_REDO, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0} + }; + + TBBUTTON tbAddButtons[7] = { + { 0, IDC_BOLD, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, 0}, + { 1, IDC_UNDERLINE, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, 0}, + { 2, IDC_COLOR, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 3, IDC_BGCOLOR, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, + { 4, IDC_GOTO, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_FIND, IDC_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0} + }; + hTool = CreateToolbarEx(hwndParent, WS_VISIBLE|WS_CHILD|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS, + IDC_TOOLBAR, 0, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, + tbButtons, 10, 0, 0, 100, 30, sizeof(TBBUTTON)); + tbBit.hInst = hInstance; + tbBit.nID = IDB_BITMAP1; + newidx = SendMessage(hTool, TB_ADDBITMAP, (WPARAM)5, (LPARAM)&tbBit); + tbAddButtons[0].iBitmap += newidx; + tbAddButtons[1].iBitmap += newidx; + tbAddButtons[2].iBitmap += newidx; + tbAddButtons[3].iBitmap += newidx; + tbAddButtons[5].iBitmap += newidx; + SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)7, (LPARAM)&tbAddButtons); + return hTool; +} + +/* Dialog procedure for the color selection dialog + * Parameters: + * hDlg - The dialog handle + * message - The message received + * wParam - The first message parameter + * lParam - The second message parameter + * Returns: + * TRUE if the message was processed, FALSE otherwise + */ +LRESULT CALLBACK ColorDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { + static HBRUSH hBrushWhite, hBrushBlack, hBrushDarkBlue, hBrushDarkGreen, hBrushRed, + hBrushDarkRed, hBrushPurple, hBrushOrange, hBrushYellow, hBrushGreen, hBrushVDarkGreen, + hBrushLightBlue, hBrushBlue, hBrushPink, hBrushDarkGray, hBrushGray; + static UINT ResultMsg = 0; + + switch (message) + { + case WM_INITDIALOG: + hBrushWhite = CreateSolidBrush(RGB(255,255,255)); + hBrushBlack = CreateSolidBrush(RGB(0,0,0)); + hBrushDarkBlue = CreateSolidBrush(RGB(0,0,127)); + hBrushDarkGreen = CreateSolidBrush(RGB(0,147,0)); + hBrushRed = CreateSolidBrush(RGB(255,0,0)); + hBrushDarkRed = CreateSolidBrush(RGB(127,0,0)); + hBrushPurple = CreateSolidBrush(RGB(156,0,156)); + hBrushOrange = CreateSolidBrush(RGB(252,127,0)); + hBrushYellow = CreateSolidBrush(RGB(255,255,0)); + hBrushGreen = CreateSolidBrush(RGB(0,252,0)); + hBrushVDarkGreen = CreateSolidBrush(RGB(0,147,147)); + hBrushLightBlue = CreateSolidBrush(RGB(0,255,255)); + hBrushBlue = CreateSolidBrush(RGB(0,0,252)); + hBrushPink = CreateSolidBrush(RGB(255,0,255)); + hBrushDarkGray = CreateSolidBrush(RGB(127,127,127)); + hBrushGray = CreateSolidBrush(RGB(210,210,210)); + ResultMsg = (UINT)lParam; + SetFocus(NULL); + return TRUE; + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam; + if (wParam == IDC_WHITE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushWhite); + if (wParam == IDC_BLACK) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushBlack); + if (wParam == IDC_DARKBLUE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkBlue); + if (wParam == IDC_DARKGREEN) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkGreen); + if (wParam == IDC_RED) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushRed); + if (wParam == IDC_DARKRED) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkRed); + if (wParam == IDC_PURPLE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushPurple); + if (wParam == IDC_ORANGE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushOrange); + if (wParam == IDC_YELLOW) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushYellow); + if (wParam == IDC_GREEN) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushGreen); + if (wParam == IDC_VDARKGREEN) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushVDarkGreen); + if (wParam == IDC_LIGHTBLUE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushLightBlue); + if (wParam == IDC_BLUE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushBlue); + if (wParam == IDC_PINK) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushPink); + if (wParam == IDC_DARKGRAY) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkGray); + if (wParam == IDC_GRAY) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushGray); + DrawEdge(lpdis->hDC, &lpdis->rcItem, EDGE_SUNKEN, BF_RECT); + return TRUE; + } + case WM_COMMAND: + { + COLORREF clrref; + if (LOWORD(wParam) == IDC_WHITE) + clrref = RGB(255,255,255); + else if (LOWORD(wParam) == IDC_BLACK) + clrref = RGB(0,0,0); + else if (LOWORD(wParam) == IDC_DARKBLUE) + clrref = RGB(0,0,127); + else if (LOWORD(wParam) == IDC_DARKGREEN) + clrref = RGB(0,147,0); + else if (LOWORD(wParam) == IDC_RED) + clrref = RGB(255,0,0); + else if (LOWORD(wParam) == IDC_DARKRED) + clrref = RGB(127,0,0); + else if (LOWORD(wParam) == IDC_PURPLE) + clrref = RGB(156,0,156); + else if (LOWORD(wParam) == IDC_ORANGE) + clrref = RGB(252,127,0); + else if (LOWORD(wParam) == IDC_YELLOW) + clrref = RGB(255,255,0); + else if (LOWORD(wParam) == IDC_GREEN) + clrref = RGB(0,252,0); + else if (LOWORD(wParam) == IDC_VDARKGREEN) + clrref = RGB(0,147,147); + else if (LOWORD(wParam) == IDC_LIGHTBLUE) + clrref = RGB(0,255,255); + else if (LOWORD(wParam) == IDC_BLUE) + clrref = RGB(0,0,252); + else if (LOWORD(wParam) == IDC_PINK) + clrref = RGB(255,0,255); + else if (LOWORD(wParam) == IDC_DARKGRAY) + clrref = RGB(127,127,127); + else if (LOWORD(wParam) == IDC_GRAY) + clrref = RGB(210,210,210); + SendMessage(GetParent(hDlg), ResultMsg, (WPARAM)clrref, (LPARAM)hDlg); + break; + } + case WM_CLOSE: + EndDialog(hDlg, TRUE); + case WM_DESTROY: + DeleteObject(hBrushWhite); + DeleteObject(hBrushBlack); + DeleteObject(hBrushDarkBlue); + DeleteObject(hBrushDarkGreen); + DeleteObject(hBrushRed); + DeleteObject(hBrushDarkRed); + DeleteObject(hBrushPurple); + DeleteObject(hBrushOrange); + DeleteObject(hBrushYellow); + DeleteObject(hBrushGreen); + DeleteObject(hBrushVDarkGreen); + DeleteObject(hBrushLightBlue); + DeleteObject(hBrushBlue); + DeleteObject(hBrushPink); + DeleteObject(hBrushDarkGray); + DeleteObject(hBrushGray); + break; + } + + return FALSE; +} + +/* Dialog procedure for the goto dialog + * Parameters: + * hDlg - The dialog handle + * message - The message received + * wParam - The first message parameter + * lParam - The second message parameter + * Returns: + * TRUE if the message was processed, FALSE otherwise + */ +LRESULT CALLBACK GotoDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + if (message == WM_COMMAND) + { + if (LOWORD(wParam) == IDCANCEL) + EndDialog(hDlg, TRUE); + else if (LOWORD(wParam) == IDOK) + { + HWND hWnd = GetDlgItem(GetParent(hDlg),IDC_TEXT); + int line = GetDlgItemInt(hDlg, IDC_GOTO, NULL, FALSE); + int pos = SendMessage(hWnd, EM_LINEINDEX, (WPARAM)--line, 0); + SendMessage(hWnd, EM_SETSEL, (WPARAM)pos, (LPARAM)pos); + SendMessage(hWnd, EM_SCROLLCARET, 0, 0); + EndDialog(hDlg, TRUE); + } + } + return FALSE; +} + +LRESULT CALLBACK FromFileDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + HWND hWnd; + static FINDREPLACE find; + static char findbuf[256]; + static unsigned char *file; + static HWND hTool, hClip, hStatus; + static RECT rOld; + CHARFORMAT2 chars; + + if (message == WM_FINDMSGSTRING) + { + FINDREPLACE *fr = (FINDREPLACE *)lParam; + + if (fr->Flags & FR_FINDNEXT) + { + HWND hRich = GetDlgItem(hDlg, IDC_TEXT); + DWORD flags=0; + FINDTEXTEX ft; + CHARRANGE chrg; + + if (fr->Flags & FR_DOWN) + flags |= FR_DOWN; + if (fr->Flags & FR_MATCHCASE) + flags |= FR_MATCHCASE; + if (fr->Flags & FR_WHOLEWORD) + flags |= FR_WHOLEWORD; + ft.lpstrText = fr->lpstrFindWhat; + SendMessage(hRich, EM_EXGETSEL, 0, (LPARAM)&chrg); + if (flags & FR_DOWN) + { + ft.chrg.cpMin = chrg.cpMax; + ft.chrg.cpMax = -1; + } + else + { + ft.chrg.cpMin = chrg.cpMin; + ft.chrg.cpMax = -1; + } + if (SendMessage(hRich, EM_FINDTEXTEX, flags, (LPARAM)&ft) == -1) + MessageBox(NULL, "Unreal has finished searching the document", + "Find", MB_ICONINFORMATION|MB_OK); + else + { + SendMessage(hRich, EM_EXSETSEL, 0, (LPARAM)&(ft.chrgText)); + SendMessage(hRich, EM_SCROLLCARET, 0, 0); + SetFocus(hRich); + } + } + return TRUE; + } + switch (message) + { + case WM_INITDIALOG: + { + int fd,len; + unsigned char *buffer = '\0', *string = '\0'; + EDITSTREAM edit; + StreamIO *stream = malloc(sizeof(StreamIO)); + unsigned char szText[256]; + struct stat sb; + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT), hTip; + file = (unsigned char *)lParam; + if (file) + wsprintf(szText, "UnrealIRCd Editor - %s", file); + else + strcpy(szText, "UnrealIRCd Editor - New File"); + SetWindowText(hDlg, szText); + lpfnOldWndProc = (FARPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)RESubClassFunc); + hTool = DrawToolbar(hInst, hDlg); + hStatus = DrawStatusbar(hInst, hDlg, IDC_STATUS); + SendMessage(hWnd, EM_SETEVENTMASK, 0, (LPARAM)ENM_SELCHANGE); + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_FACE; + strcpy(chars.szFaceName,"Fixedsys"); + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_ALL, (LPARAM)&chars); + if ((fd = open(file, _O_RDONLY|_O_BINARY)) != -1) + { + fstat(fd,&sb); + /* Only allocate the amount we need */ + buffer = malloc(sb.st_size+1); + buffer[0] = 0; + len = read(fd, buffer, sb.st_size); + buffer[len] = 0; + len = CountRTFSize(buffer)+1; + string = malloc(len); + bzero(string,len); + IRCToRTF(buffer,string); + RTFBuf = string; + len--; + stream->size = &len; + stream->buffer = &RTFBuf; + edit.dwCookie = (UINT)stream; + edit.pfnCallback = SplitIt; + SendMessage(hWnd, EM_EXLIMITTEXT, 0, (LPARAM)0x7FFFFFFF); + SendMessage(hWnd, EM_STREAMIN, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); + SendMessage(hWnd, EM_SETMODIFY, (WPARAM)FALSE, 0); + SendMessage(hWnd, EM_EMPTYUNDOBUFFER, 0, 0); + close(fd); + RTFBuf = NULL; + free(buffer); + free(string); + free(stream); + hClip = SetClipboardViewer(hDlg); + if (SendMessage(hWnd, EM_CANPASTE, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(FALSE,0)); + wsprintf(szText, "Line: 1"); + SetWindowText(hStatus, szText); + } + return TRUE; + } + case WM_WINDOWPOSCHANGING: + { + GetClientRect(hDlg, &rOld); + return FALSE; + } + case WM_SIZE: + { + DWORD new_width, new_height; + HWND hRich; + RECT rOldRich; + DWORD old_width, old_height; + DWORD old_rich_width, old_rich_height; + if (hDlg == hFind) + return FALSE; + new_width = LOWORD(lParam); + new_height = HIWORD(lParam); + hRich = GetDlgItem(hDlg, IDC_TEXT); + SendMessage(hStatus, WM_SIZE, 0, 0); + SendMessage(hTool, TB_AUTOSIZE, 0, 0); + old_width = rOld.right-rOld.left; + old_height = rOld.bottom-rOld.top; + new_width = new_width - old_width; + new_height = new_height - old_height; + GetWindowRect(hRich, &rOldRich); + old_rich_width = rOldRich.right-rOldRich.left; + old_rich_height = rOldRich.bottom-rOldRich.top; + SetWindowPos(hRich, NULL, 0, 0, old_rich_width+new_width, + old_rich_height+new_height, + SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOZORDER); + bzero(&rOld, sizeof(RECT)); + return TRUE; + } + + case WM_NOTIFY: + switch (((NMHDR *)lParam)->code) + { + case EN_SELCHANGE: + { + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); + DWORD start, end, currline; + static DWORD prevline = 0; + unsigned char buffer[512]; + chars.cbSize = sizeof(CHARFORMAT2); + SendMessage(hWnd, EM_GETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + if (chars.dwMask & CFM_BOLD && chars.dwEffects & CFE_BOLD) + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_BOLD, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_BOLD, (LPARAM)MAKELONG(FALSE,0)); + if (chars.dwMask & CFM_UNDERLINE && chars.dwEffects & CFE_UNDERLINE) + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_UNDERLINE, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_UNDERLINE, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hWnd, EM_GETSEL,(WPARAM)&start, (LPARAM)&end); + if (start == end) + { + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_COPY, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_CUT, (LPARAM)MAKELONG(FALSE,0)); + } + else + { + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_COPY, (LPARAM)MAKELONG(TRUE,0)); + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_CUT, (LPARAM)MAKELONG(TRUE,0)); + } + if (SendMessage(hWnd, EM_CANUNDO, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(FALSE,0)); + if (SendMessage(hWnd, EM_CANREDO, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_REDO, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_REDO, (LPARAM)MAKELONG(FALSE,0)); + currline = SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)-1, 0); + currline++; + if (currline != prevline) + { + wsprintf(buffer, "Line: %d", currline); + SetWindowText(hStatus, buffer); + prevline = currline; + } + return TRUE; + } + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam; + lpttt->hinst = NULL; + switch (lpttt->hdr.idFrom) + { + case IDM_NEW: + strcpy(lpttt->szText, "New"); + break; + case IDM_SAVE: + strcpy(lpttt->szText, "Save"); + break; + case IDM_CUT: + strcpy(lpttt->szText, "Cut"); + break; + case IDM_COPY: + strcpy(lpttt->szText, "Copy"); + break; + case IDM_PASTE: + strcpy(lpttt->szText, "Paste"); + break; + case IDM_UNDO: + strcpy(lpttt->szText, "Undo"); + break; + case IDM_REDO: + strcpy(lpttt->szText, "Redo"); + break; + case IDC_BOLD: + strcpy(lpttt->szText, "Bold"); + break; + case IDC_UNDERLINE: + strcpy(lpttt->szText, "Underline"); + break; + case IDC_COLOR: + strcpy(lpttt->szText, "Text Color"); + break; + case IDC_BGCOLOR: + strcpy(lpttt->szText, "Background Color"); + break; + case IDC_GOTO: + strcpy(lpttt->szText, "Goto"); + break; + case IDC_FIND: + strcpy(lpttt->szText, "Find"); + break; + } + return TRUE; + } + case NM_DBLCLK: + DialogBox(hInst, "GOTO", hDlg, (DLGPROC)GotoDLG); + return (TRUE); + } + + return (TRUE); + case WM_COMMAND: + if (LOWORD(wParam) == IDC_BOLD) + { + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (SendMessage(hTool, TB_ISBUTTONCHECKED, (WPARAM)IDC_BOLD, (LPARAM)0) != 0) + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_BOLD; + chars.dwEffects = CFE_BOLD; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + else + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_BOLD; + chars.dwEffects = 0; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + return TRUE; + } + else if (LOWORD(wParam) == IDC_UNDERLINE) + { + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (SendMessage(hTool, TB_ISBUTTONCHECKED, (WPARAM)IDC_UNDERLINE, (LPARAM)0) != 0) + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_UNDERLINETYPE; + chars.bUnderlineType = CFU_UNDERLINE; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + else + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_UNDERLINETYPE; + chars.bUnderlineType = CFU_UNDERLINENONE; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + return TRUE; + } + if (LOWORD(wParam) == IDC_COLOR) + { + DialogBoxParam(hInst, "Color", hDlg, (DLGPROC)ColorDLG, (LPARAM)WM_USER+10); + return 0; + } + if (LOWORD(wParam) == IDC_BGCOLOR) + { + DialogBoxParam(hInst, "Color", hDlg, (DLGPROC)ColorDLG, (LPARAM)WM_USER+11); + return 0; + } + if (LOWORD(wParam) == IDC_GOTO) + { + DialogBox(hInst, "GOTO", hDlg, (DLGPROC)GotoDLG); + return 0; + } + if (LOWORD(wParam) == IDC_FIND) + { + static FINDREPLACE fr; + bzero(&fr, sizeof(FINDREPLACE)); + fr.lStructSize = sizeof(FINDREPLACE); + fr.hwndOwner = hDlg; + fr.lpstrFindWhat = findbuf; + fr.wFindWhatLen = 255; + hFind = FindText(&fr); + return 0; + } + + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (LOWORD(wParam) == IDM_COPY) + { + SendMessage(hWnd, WM_COPY, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_SELECTALL) + { + SendMessage(hWnd, EM_SETSEL, 0, -1); + return 0; + } + if (LOWORD(wParam) == IDM_PASTE) + { + SendMessage(hWnd, WM_PASTE, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_CUT) + { + SendMessage(hWnd, WM_CUT, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_UNDO) + { + SendMessage(hWnd, EM_UNDO, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_REDO) + { + SendMessage(hWnd, EM_REDO, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_DELETE) + { + SendMessage(hWnd, WM_CLEAR, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_SAVE) + { + int fd; + EDITSTREAM edit; + OPENFILENAME lpopen; + if (!file) + { + unsigned char path[MAX_PATH]; + path[0] = '\0'; + bzero(&lpopen, sizeof(OPENFILENAME)); + lpopen.lStructSize = sizeof(OPENFILENAME); + lpopen.hwndOwner = hDlg; + lpopen.lpstrFilter = NULL; + lpopen.lpstrCustomFilter = NULL; + lpopen.nFilterIndex = 0; + lpopen.lpstrFile = path; + lpopen.nMaxFile = MAX_PATH; + lpopen.lpstrFileTitle = NULL; + lpopen.lpstrInitialDir = DPATH; + lpopen.lpstrTitle = NULL; + lpopen.Flags = (OFN_ENABLESIZING|OFN_NONETWORKBUTTON| + OFN_OVERWRITEPROMPT); + if (GetSaveFileName(&lpopen)) + file = path; + else + break; + } + fd = open(file, _O_TRUNC|_O_CREAT|_O_WRONLY|_O_BINARY,_S_IWRITE); + edit.dwCookie = 0; + edit.pfnCallback = BufferIt; + SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_STREAMOUT, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); + RTFToIRC(fd, RTFBuf, strlen(RTFBuf)); + free(RTFBuf); + RTFBuf = NULL; + SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_SETMODIFY, (WPARAM)FALSE, 0); + + return 0; + } + if (LOWORD(wParam) == IDM_NEW) + { + unsigned char text[1024]; + BOOL newfile = FALSE; + int ans; + if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_GETMODIFY, 0, 0) != 0) + { + sprintf(text, "The text in the %s file has changed.\r\n\r\nDo you want to save the changes?", file ? file : "new"); + ans = MessageBox(hDlg, text, "UnrealIRCd", MB_YESNOCANCEL|MB_ICONWARNING); + if (ans == IDNO) + newfile = TRUE; + if (ans == IDCANCEL) + return TRUE; + if (ans == IDYES) + { + SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDM_SAVE,0), 0); + newfile = TRUE; + } + } + else + newfile = TRUE; + if (newfile == TRUE) + { + unsigned char szText[256]; + file = NULL; + strcpy(szText, "UnrealIRCd Editor - New File"); + SetWindowText(hDlg, szText); + SetWindowText(GetDlgItem(hDlg, IDC_TEXT), NULL); + } + break; + } + break; + case WM_USER+10: + { + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); + EndDialog((HWND)lParam, TRUE); + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_COLOR; + chars.crTextColor = (COLORREF)wParam; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + break; + } + case WM_USER+11: + { + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); + EndDialog((HWND)lParam, TRUE); + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_BACKCOLOR; + chars.crBackColor = (COLORREF)wParam; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + break; + } + case WM_CHANGECBCHAIN: + if ((HWND)wParam == hClip) + hClip = (HWND)lParam; + else + SendMessage(hClip, WM_CHANGECBCHAIN, wParam, lParam); + break; + case WM_DRAWCLIPBOARD: + if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_CANPASTE, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hClip, WM_DRAWCLIPBOARD, wParam, lParam); + break; + case WM_CLOSE: + { + unsigned char text[256]; + int ans; + if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_GETMODIFY, 0, 0) != 0) + { + sprintf(text, "The text in the %s file has changed.\r\n\r\nDo you want to save the changes?", file ? file : "new"); + ans = MessageBox(hDlg, text, "UnrealIRCd", MB_YESNOCANCEL|MB_ICONWARNING); + if (ans == IDNO) + EndDialog(hDlg, TRUE); + if (ans == IDCANCEL) + return TRUE; + if (ans == IDYES) + { + SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDM_SAVE,0), 0); + EndDialog(hDlg, TRUE); + } + } + else + EndDialog(hDlg, TRUE); + break; + } + case WM_DESTROY: + ChangeClipboardChain(hDlg, hClip); + break; + } + + return FALSE; +} diff --git a/src/win32/gui.c b/src/win32/gui.c new file mode 100644 index 000000000..f90862d0c --- /dev/null +++ b/src/win32/gui.c @@ -0,0 +1,1080 @@ +/************************************************************************ + * IRC - Internet Relay Chat, win32/gui.c + * Copyright (C) 2000-2004 David Flynn (DrBin) & Dominick Meglio (codemastr) + * + * 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. + */ + +#define WIN32_VERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 +#include "resource.h" +#include "version.h" +#include "setup.h" +#ifdef INET6 +#include +#include +#endif +#include +#include +#include +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include +#include +#include +#include +#include +#include +#include "h.h" +#include +#include +#include "win32.h" + +__inline void ShowDialog(HWND *handle, HINSTANCE inst, char *template, HWND parent, + DLGPROC proc) +{ + if (!IsWindow(*handle)) + { + *handle = CreateDialog(inst, template, parent, (DLGPROC)proc); + ShowWindow(*handle, SW_SHOW); + } + else + SetForegroundWindow(*handle); +} + +/* Comments: + * + * DrBin did a great job with the original GUI, but he has been gone a long time. + * In his absense, it was decided it would be best to continue windows development. + * The new code is based on his so it will be pretty much similar in features, my + * main goal is to make it more stable. A lot of what I know about GUI coding + * I learned from DrBin so thanks to him for teaching me :) -- codemastr + */ + +LRESULT CALLBACK MainDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK LicenseDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK CreditsDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK DalDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK HelpDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK StatusDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK ConfigErrorDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK FromVarDLG(HWND, UINT, WPARAM, LPARAM, unsigned char *, unsigned char **); +LRESULT CALLBACK FromFileReadDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK FromFileDLG(HWND, UINT, WPARAM, LPARAM); + +extern void SocketLoop(void *dummy); +HINSTANCE hInst; +NOTIFYICONDATA SysTray; +void CleanUp(void); +HTREEITEM AddItemToTree(HWND, LPSTR, int, short); +void win_map(aClient *, HWND, short); +extern Link *Servers; +extern ircstats IRCstats; +unsigned char *errors = NULL; +extern aMotd *botmotd, *opermotd, *motd, *rules; +extern VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv); +extern BOOL IsService; +void CleanUp(void) +{ + Shell_NotifyIcon(NIM_DELETE ,&SysTray); +} +void CleanUpSegv(int sig) +{ + Shell_NotifyIcon(NIM_DELETE ,&SysTray); +} +HWND hStatusWnd; +HWND hwIRCDWnd=NULL; +HWND hwTreeView; +HWND hWndMod; +HANDLE hMainThread = 0; +UINT WM_TASKBARCREATED, WM_FINDMSGSTRING; +FARPROC lpfnOldWndProc; +HMENU hContext; +OSVERSIONINFO VerInfo; +char OSName[256]; +#ifdef USE_LIBCURL +extern char *find_loaded_remote_include(char *url); +#endif + +void TaskBarCreated() +{ + HICON hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(ICO_MAIN), IMAGE_ICON,16, 16, 0); + SysTray.cbSize = sizeof(NOTIFYICONDATA); + SysTray.hIcon = hIcon; + SysTray.hWnd = hwIRCDWnd; + SysTray.uCallbackMessage = WM_USER; + SysTray.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE; + SysTray.uID = 0; + strcpy(SysTray.szTip, WIN32_VERSION); + Shell_NotifyIcon(NIM_ADD ,&SysTray); +} + +LRESULT LinkSubClassFunc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static HCURSOR hCursor; + if (!hCursor) + hCursor = LoadCursor(hInst, MAKEINTRESOURCE(CUR_HAND)); + if (Message == WM_MOUSEMOVE || Message == WM_LBUTTONDOWN) + SetCursor(hCursor); + + return CallWindowProc((WNDPROC)lpfnOldWndProc, hWnd, Message, wParam, lParam); +} + + + +LRESULT RESubClassFunc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + POINT p; + RECT r; + DWORD start, end; + unsigned char string[500]; + + if (Message == WM_GETDLGCODE) + return DLGC_WANTALLKEYS; + + + if (Message == WM_CONTEXTMENU) + { + p.x = GET_X_LPARAM(lParam); + p.y = GET_Y_LPARAM(lParam); + if (GET_X_LPARAM(lParam) == -1 && GET_Y_LPARAM(lParam) == -1) + { + GetClientRect(hWnd, &r); + p.x = (int)((r.left + r.right)/2); + p.y = (int)((r.top + r.bottom)/2); + ClientToScreen(hWnd,&p); + } + if (!SendMessage(hWnd, EM_CANUNDO, 0, 0)) + EnableMenuItem(hContext, IDM_UNDO, MF_BYCOMMAND|MF_GRAYED); + else + EnableMenuItem(hContext, IDM_UNDO, MF_BYCOMMAND|MF_ENABLED); + if (!SendMessage(hWnd, EM_CANPASTE, 0, 0)) + EnableMenuItem(hContext, IDM_PASTE, MF_BYCOMMAND|MF_GRAYED); + else + EnableMenuItem(hContext, IDM_PASTE, MF_BYCOMMAND|MF_ENABLED); + if (GetWindowLong(hWnd, GWL_STYLE) & ES_READONLY) + { + EnableMenuItem(hContext, IDM_CUT, MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hContext, IDM_DELETE, MF_BYCOMMAND|MF_GRAYED); + } + else + { + EnableMenuItem(hContext, IDM_CUT, MF_BYCOMMAND|MF_ENABLED); + EnableMenuItem(hContext, IDM_DELETE, MF_BYCOMMAND|MF_ENABLED); + } + SendMessage(hWnd, EM_GETSEL, (WPARAM)&start, (LPARAM)&end); + if (start == end) + EnableMenuItem(hContext, IDM_COPY, MF_BYCOMMAND|MF_GRAYED); + else + EnableMenuItem(hContext, IDM_COPY, MF_BYCOMMAND|MF_ENABLED); + TrackPopupMenu(hContext,TPM_LEFTALIGN|TPM_RIGHTBUTTON,p.x,p.y,0,GetParent(hWnd),NULL); + return 0; + } + + return CallWindowProc((WNDPROC)lpfnOldWndProc, hWnd, Message, wParam, lParam); +} + +int CloseUnreal(HWND hWnd) +{ + if (MessageBox(hWnd, "Close UnrealIRCd?", "Are you sure?", MB_YESNO|MB_ICONQUESTION) + == IDNO) + return 0; + else + { + DestroyWindow(hWnd); + exit(0); + } +} + +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +{ + MSG msg; + unsigned char *s; + HWND hWnd; + WSADATA WSAData; + HICON hIcon; + SERVICE_TABLE_ENTRY DispatchTable[] = + { + { "UnrealIRCd", ServiceMain }, + { 0, 0 } + }; + DWORD need; + + VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&VerInfo); + GetOSName(VerInfo, OSName); + if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + SC_HANDLE hService, hSCManager = OpenSCManager(NULL, NULL, GENERIC_EXECUTE); + if ((hService = OpenService(hSCManager, "UnrealIRCd", GENERIC_EXECUTE))) + { + int save_err = 0; + StartServiceCtrlDispatcher(DispatchTable); + if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) + { + SERVICE_STATUS status; + /* Restart handling, it's ugly but it's as + * pretty as it is gonna get :) + */ + if (__argc == 2 && !strcmp(__argv[1], "restartsvc")) + { + QueryServiceStatus(hService, &status); + if (status.dwCurrentState != SERVICE_STOPPED) + { + ControlService(hService, + SERVICE_CONTROL_STOP, &status); + while (status.dwCurrentState == SERVICE_STOP_PENDING) + { + QueryServiceStatus(hService, &status); + if (status.dwCurrentState != SERVICE_STOPPED) + Sleep(1000); + } + } + } + if (!StartService(hService, 0, NULL)) + save_err = GetLastError(); + } + + CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); + if (save_err != ERROR_SERVICE_DISABLED) + exit(0); + } else { + CloseServiceHandle(hSCManager); + } + } + InitCommonControls(); + WM_TASKBARCREATED = RegisterWindowMessage("TaskbarCreated"); + WM_FINDMSGSTRING = RegisterWindowMessage(FINDMSGSTRING); + atexit(CleanUp); + if(!LoadLibrary("riched20.dll")) + LoadLibrary("riched32.dll"); + InitDebug(); + + if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0) + { + MessageBox(NULL, "Unable to initialize WinSock", "UnrealIRCD Initalization Error", MB_OK); + return FALSE; + } + hInst = hInstance; + + hWnd = CreateDialog(hInstance, "WIRCD", 0, (DLGPROC)MainDLG); + hwIRCDWnd = hWnd; + + TaskBarCreated(); + + if (InitwIRCD(__argc, __argv) != 1) + { + MessageBox(NULL, "UnrealIRCd has failed to initialize in InitwIRCD()", "UnrealIRCD Initalization Error" ,MB_OK); + return FALSE; + } + ShowWindow(hWnd, SW_SHOW); + hMainThread = (HANDLE)_beginthread(SocketLoop, 0, NULL); + while (GetMessage(&msg, NULL, 0, 0)) + { + if (!IsWindow(hStatusWnd) || !IsDialogMessage(hStatusWnd, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + return FALSE; + +} + +LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static HCURSOR hCursor; + static HMENU hRehash, hAbout, hConfig, hTray, hLogs; + + unsigned char *argv[3]; + aClient *paClient; + unsigned char *msg; + POINT p; + + if (message == WM_TASKBARCREATED) + { + TaskBarCreated(); + return TRUE; + } + + switch (message) + { + case WM_INITDIALOG: + { + ShowWindow(hDlg, SW_HIDE); + hCursor = LoadCursor(hInst, MAKEINTRESOURCE(CUR_HAND)); + hContext = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_CONTEXT)),0); + /* Rehash popup menu */ + hRehash = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_REHASH)),0); + /* About popup menu */ + hAbout = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_ABOUT)),0); + /* Systray popup menu set the items to point to the other menus*/ + hTray = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(MENU_SYSTRAY)),0); + ModifyMenu(hTray, IDM_REHASH, MF_BYCOMMAND|MF_POPUP|MF_STRING, (UINT)hRehash, "&Rehash"); + ModifyMenu(hTray, IDM_ABOUT, MF_BYCOMMAND|MF_POPUP|MF_STRING, (UINT)hAbout, "&About"); + + SetWindowText(hDlg, WIN32_VERSION); + SendMessage(hDlg, WM_SETICON, (WPARAM)ICON_SMALL, + (LPARAM)(HICON)LoadImage(hInst, MAKEINTRESOURCE(ICO_MAIN), IMAGE_ICON,16, 16, 0)); + SendMessage(hDlg, WM_SETICON, (WPARAM)ICON_BIG, + (LPARAM)(HICON)LoadImage(hInst, MAKEINTRESOURCE(ICO_MAIN), IMAGE_ICON,32, 32, 0)); + return TRUE; + } + case WM_SIZE: + { + if (wParam & SIZE_MINIMIZED) + ShowWindow(hDlg,SW_HIDE); + return 0; + } + case WM_CLOSE: + return CloseUnreal(hDlg); + case WM_USER: + { + switch(LOWORD(lParam)) + { + case WM_LBUTTONDBLCLK: + ShowWindow(hDlg, SW_SHOW); + ShowWindow(hDlg,SW_RESTORE); + SetForegroundWindow(hDlg); + case WM_RBUTTONDOWN: + SetForegroundWindow(hDlg); + break; + case WM_RBUTTONUP: + { + unsigned long i = 60000; + GetCursorPos(&p); + DestroyMenu(hConfig); + hConfig = CreatePopupMenu(); + DestroyMenu(hLogs); + hLogs = CreatePopupMenu(); + AppendMenu(hConfig, MF_STRING, IDM_CONF, CPATH); + if (conf_log) + { + ConfigItem_log *logs; + AppendMenu(hConfig, MF_POPUP|MF_STRING, (UINT)hLogs, "Logs"); + for (logs = conf_log; logs; logs = (ConfigItem_log *)logs->next) + { + AppendMenu(hLogs, MF_STRING, i++, logs->file); + } + } + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + if (conf_include) + { + ConfigItem_include *inc; + for (inc = conf_include; inc; inc = (ConfigItem_include *)inc->next) + { + if (inc->flag.type & INCLUDE_NOTLOADED) + continue; +#ifdef USE_LIBCURL + if (inc->flag.type & INCLUDE_REMOTE) + AppendMenu(hConfig, MF_STRING, i++, inc->url); + else +#endif + AppendMenu(hConfig, MF_STRING, i++, inc->file); + } + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + } + AppendMenu(hConfig, MF_STRING, IDM_MOTD, MPATH); + AppendMenu(hConfig, MF_STRING, IDM_SMOTD, SMPATH); + AppendMenu(hConfig, MF_STRING, IDM_OPERMOTD, OPATH); + AppendMenu(hConfig, MF_STRING, IDM_BOTMOTD, BPATH); + AppendMenu(hConfig, MF_STRING, IDM_RULES, RPATH); + + if (conf_tld) + { + ConfigItem_tld *tlds; + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + for (tlds = conf_tld; tlds; tlds = (ConfigItem_tld *)tlds->next) + { + if (!tlds->flag.motdptr) + AppendMenu(hConfig, MF_STRING, i++, tlds->motd_file); + if (!tlds->flag.rulesptr) + AppendMenu(hConfig, MF_STRING, i++, tlds->rules_file); + if (tlds->smotd_file) + AppendMenu(hConfig, MF_STRING, i++, tlds->smotd_file); + } + } + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + AppendMenu(hConfig, MF_STRING, IDM_NEW, "New File"); + ModifyMenu(hTray, IDM_CONFIG, MF_BYCOMMAND|MF_POPUP|MF_STRING, (UINT)hConfig, "&Config"); + TrackPopupMenu(hTray, TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); + /* Kludge for a win bug */ + SendMessage(hDlg, WM_NULL, 0, 0); + break; + } + } + return 0; + } + case WM_DESTROY: + return 0; + case WM_MOUSEMOVE: + { + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + if ((p.x >= 24) && (p.x <= 78) && (p.y >= 178) && (p.y <= 190)) + SetCursor(hCursor); + else if ((p.x >= 85) && (p.x <= 132) && (p.y >= 178) && (p.y <= 190)) + SetCursor(hCursor); + else if ((p.x >= 140) && (p.x <= 186) && (p.y >= 178) && (p.y <= 190)) + SetCursor(hCursor); + else if ((p.x >= 194) && (p.x <= 237) && (p.y >= 178) && (p.y <= 190)) + SetCursor(hCursor); + else if ((p.x >= 245) && (p.x <= 311) && (p.y >= 178) && (p.y <= 190)) + SetCursor(hCursor); + return 0; + } + case WM_LBUTTONDOWN: + { + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + if ((p.x >= 24) && (p.x <= 78) && (p.y >= 178) && (p.y <= 190)) + { + ClientToScreen(hDlg,&p); + TrackPopupMenu(hRehash,TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); + return 0; + } + else if ((p.x >= 85) && (p.x <= 132) && (p.y >= 178) && (p.y <= 190)) + { + ShowDialog(&hStatusWnd, hInst, "Status", hDlg, StatusDLG); + return 0; + } + else if ((p.x >= 140) && (p.x <= 186) && (p.y >= 178) && (p.y <= 190)) + { + unsigned long i = 60000; + ClientToScreen(hDlg,&p); + DestroyMenu(hConfig); + hConfig = CreatePopupMenu(); + DestroyMenu(hLogs); + hLogs = CreatePopupMenu(); + + AppendMenu(hConfig, MF_STRING, IDM_CONF, CPATH); + if (conf_log) + { + ConfigItem_log *logs; + AppendMenu(hConfig, MF_POPUP|MF_STRING, (UINT)hLogs, "Logs"); + for (logs = conf_log; logs; logs = (ConfigItem_log *)logs->next) + { + AppendMenu(hLogs, MF_STRING, i++, logs->file); + } + } + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + + if (conf_include) + { + ConfigItem_include *inc; + for (inc = conf_include; inc; inc = (ConfigItem_include *)inc->next) + { +#ifdef USE_LIBCURL + if (inc->flag.type & INCLUDE_REMOTE) + AppendMenu(hConfig, MF_STRING, i++, inc->url); + else +#endif + AppendMenu(hConfig, MF_STRING, i++, inc->file); + } + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + } + + AppendMenu(hConfig, MF_STRING, IDM_MOTD, MPATH); + AppendMenu(hConfig, MF_STRING, IDM_SMOTD, SMPATH); + AppendMenu(hConfig, MF_STRING, IDM_OPERMOTD, OPATH); + AppendMenu(hConfig, MF_STRING, IDM_BOTMOTD, BPATH); + AppendMenu(hConfig, MF_STRING, IDM_RULES, RPATH); + + if (conf_tld) + { + ConfigItem_tld *tlds; + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + for (tlds = conf_tld; tlds; tlds = (ConfigItem_tld *)tlds->next) + { + if (!tlds->flag.motdptr) + AppendMenu(hConfig, MF_STRING, i++, tlds->motd_file); + if (!tlds->flag.rulesptr) + AppendMenu(hConfig, MF_STRING, i++, tlds->rules_file); + if (tlds->smotd_file) + AppendMenu(hConfig, MF_STRING, i++, tlds->smotd_file); + } + } + AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); + AppendMenu(hConfig, MF_STRING, IDM_NEW, "New File"); + TrackPopupMenu(hConfig,TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); + + return 0; + } + else if ((p.x >= 194) && (p.x <= 237) && (p.y >= 178) && (p.y <= 190)) + { + ClientToScreen(hDlg,&p); + TrackPopupMenu(hAbout,TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x,p.y,0,hDlg,NULL); + return 0; + } + else if ((p.x >= 245) && (p.x <= 311) && (p.y >= 178) && (p.y <= 190)) + return CloseUnreal(hDlg); + } + case WM_COMMAND: + { + if (LOWORD(wParam) >= 60000 && HIWORD(wParam) == 0 && !lParam) + { + unsigned char path[MAX_PATH]; + if (GetMenuString(hLogs, LOWORD(wParam), path, MAX_PATH, MF_BYCOMMAND)) + DialogBoxParam(hInst, "FromVar", hDlg, (DLGPROC)FromFileReadDLG, (LPARAM)path); + + else + { + GetMenuString(hConfig,LOWORD(wParam), path, MAX_PATH, MF_BYCOMMAND); +#ifdef USE_LIBCURL + if (url_is_valid(path)) + { + char *file = find_loaded_remote_include(path); + DialogBoxParam(hInst, "FromVar", hDlg, (DLGPROC)FromFileReadDLG, (LPARAM)file); + } + else +#endif + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, (LPARAM)path); + } + return FALSE; + } + + switch(LOWORD(wParam)) + { + case IDM_STATUS: + ShowDialog(&hStatusWnd, hInst, "Status", hDlg,StatusDLG); + break; + case IDM_SHUTDOWN: + return CloseUnreal(hDlg); + case IDM_RHALL: + MessageBox(NULL, "Rehashing all files", "Rehashing", MB_OK); + sendto_realops("Rehashing all files via the console"); + rehash(&me,&me,0); + reread_motdsandrules(); + break; + case IDM_RHCONF: + MessageBox(NULL, "Rehashing the Config file", "Rehashing", MB_OK); + sendto_realops("Rehashing the Config file via the console"); + rehash(&me,&me,0); + break; + case IDM_RHMOTD: + { + ConfigItem_tld *tlds; + aMotd *amotd; + MessageBox(NULL, "Rehashing all MOTD and Rules files", "Rehashing", MB_OK); + rehash_motdrules(); + sendto_realops("Rehashing all MOTD and Rules files via the console"); + break; + } + case IDM_RHOMOTD: + MessageBox(NULL, "Rehashing the OperMOTD", "Rehashing", MB_OK); + opermotd = (aMotd *) read_file(OPATH, &opermotd); + sendto_realops("Rehashing the OperMOTD via the console"); + break; + case IDM_RHBMOTD: + MessageBox(NULL, "Rehashing the BotMOTD", "Rehashing", MB_OK); + botmotd = (aMotd *) read_file(BPATH, &botmotd); + sendto_realops("Rehashing the BotMOTD via the console"); + break; + case IDM_LICENSE: + DialogBox(hInst, "FromVar", hDlg, (DLGPROC)LicenseDLG); + break; + case IDM_CREDITS: + DialogBox(hInst, "FromVar", hDlg, (DLGPROC)CreditsDLG); + break; + case IDM_DAL: + DialogBox(hInst, "FromVar", hDlg, (DLGPROC)DalDLG); + break; + case IDM_HELP: + DialogBox(hInst, "Help", hDlg, (DLGPROC)HelpDLG); + break; + case IDM_CONF: + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, + (LPARAM)CPATH); + break; + case IDM_MOTD: + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, + (LPARAM)MPATH); + break; + case IDM_SMOTD: + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, + (LPARAM)SMPATH); + break; + case IDM_OPERMOTD: + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, + (LPARAM)OPATH); + break; + case IDM_BOTMOTD: + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, + (LPARAM)BPATH); + break; + case IDM_RULES: + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, + (LPARAM)RPATH); + break; + case IDM_NEW: + DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, (LPARAM)NULL); + break; + } + } + } + return FALSE; +} + +LRESULT CALLBACK LicenseDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + return FromVarDLG(hDlg, message, wParam, lParam, "UnrealIRCd License", gnulicense); +} + +LRESULT CALLBACK CreditsDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + return FromVarDLG(hDlg, message, wParam, lParam, "UnrealIRCd Credits", unrealcredits); +} + +LRESULT CALLBACK DalDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + return FromVarDLG(hDlg, message, wParam, lParam, "UnrealIRCd DALnet Credits", dalinfotext); +} + +LRESULT CALLBACK FromVarDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam, + unsigned char *title, unsigned char **s) +{ + HWND hWnd; + switch (message) + { + case WM_INITDIALOG: + { + unsigned char String[16384]; + int size; + unsigned char *RTFString; + StreamIO *stream = malloc(sizeof(StreamIO)); + EDITSTREAM edit; + SetWindowText(hDlg, title); + bzero(String, 16384); + lpfnOldWndProc = (FARPROC)SetWindowLong(GetDlgItem(hDlg, IDC_TEXT), GWL_WNDPROC, (DWORD)RESubClassFunc); + while (*s) + { + strcat(String, *s++); + if (*s) + strcat(String, "\r\n"); + } + size = CountRTFSize(String)+1; + RTFString = malloc(size); + bzero(RTFString, size); + IRCToRTF(String,RTFString); + RTFBuf = RTFString; + size--; + stream->size = &size; + stream->buffer = &RTFBuf; + edit.dwCookie = (UINT)stream; + edit.pfnCallback = SplitIt; + SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_STREAMIN, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); + free(RTFString); + free(stream); + return TRUE; + } + + case WM_COMMAND: + { + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (LOWORD(wParam) == IDOK) + return EndDialog(hDlg, TRUE); + if (LOWORD(wParam) == IDM_COPY) + { + SendMessage(hWnd, WM_COPY, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_SELECTALL) + { + SendMessage(hWnd, EM_SETSEL, 0, -1); + return 0; + } + if (LOWORD(wParam) == IDM_PASTE) + { + SendMessage(hWnd, WM_PASTE, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_CUT) + { + SendMessage(hWnd, WM_CUT, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_UNDO) + { + SendMessage(hWnd, EM_UNDO, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_DELETE) + { + SendMessage(hWnd, WM_CLEAR, 0, 0); + return 0; + } + break; + } + case WM_CLOSE: + EndDialog(hDlg, TRUE); + break; + case WM_DESTROY: + break; + } + return (FALSE); +} + +LRESULT CALLBACK FromFileReadDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + HWND hWnd; + switch (message) + { + case WM_INITDIALOG: + { + int fd,len; + unsigned char *buffer = '\0', *string = '\0'; + EDITSTREAM edit; + StreamIO *stream = malloc(sizeof(StreamIO)); + unsigned char szText[256]; + struct stat sb; + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT), hTip; + wsprintf(szText, "UnrealIRCd Viewer - %s", (unsigned char *)lParam); + SetWindowText(hDlg, szText); + lpfnOldWndProc = (FARPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)RESubClassFunc); + if ((fd = open((unsigned char *)lParam, _O_RDONLY|_O_BINARY)) != -1) + { + fstat(fd,&sb); + /* Only allocate the amount we need */ + buffer = malloc(sb.st_size+1); + buffer[0] = 0; + len = read(fd, buffer, sb.st_size); + buffer[len] = 0; + len = CountRTFSize(buffer)+1; + string = malloc(len); + bzero(string,len); + IRCToRTF(buffer,string); + RTFBuf = string; + len--; + stream->size = &len; + stream->buffer = &RTFBuf; + edit.dwCookie = (UINT)stream; + edit.pfnCallback = SplitIt; + SendMessage(hWnd, EM_EXLIMITTEXT, 0, (LPARAM)0x7FFFFFFF); + SendMessage(hWnd, EM_STREAMIN, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); + close(fd); + RTFBuf = NULL; + free(buffer); + free(string); + free(stream); + } + return TRUE; + } + case WM_COMMAND: + { + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (LOWORD(wParam) == IDOK) + return EndDialog(hDlg, TRUE); + if (LOWORD(wParam) == IDM_COPY) + { + SendMessage(hWnd, WM_COPY, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_SELECTALL) + { + SendMessage(hWnd, EM_SETSEL, 0, -1); + return 0; + } + if (LOWORD(wParam) == IDM_PASTE) + { + SendMessage(hWnd, WM_PASTE, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_CUT) + { + SendMessage(hWnd, WM_CUT, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_UNDO) + { + SendMessage(hWnd, EM_UNDO, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_DELETE) + { + SendMessage(hWnd, WM_CLEAR, 0, 0); + return 0; + } + break; + } + case WM_CLOSE: + EndDialog(hDlg, TRUE); + break; + case WM_DESTROY: + break; + } + return FALSE; +} + +LRESULT CALLBACK HelpDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static HFONT hFont; + static HCURSOR hCursor; + switch (message) + { + case WM_INITDIALOG: + hCursor = LoadCursor(hInst, MAKEINTRESOURCE(CUR_HAND)); + hFont = CreateFont(8,0,0,0,0,0,1,0,ANSI_CHARSET,0,0,PROOF_QUALITY,0,"MS Sans Serif"); + SendMessage(GetDlgItem(hDlg, IDC_EMAIL), WM_SETFONT, (WPARAM)hFont,TRUE); + SendMessage(GetDlgItem(hDlg, IDC_URL), WM_SETFONT, (WPARAM)hFont,TRUE); + lpfnOldWndProc = (FARPROC)SetWindowLong(GetDlgItem(hDlg, IDC_EMAIL), GWL_WNDPROC, (DWORD)LinkSubClassFunc); + SetWindowLong(GetDlgItem(hDlg, IDC_URL), GWL_WNDPROC, (DWORD)LinkSubClassFunc); + return TRUE; + + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam; + unsigned char text[500]; + COLORREF oldtext; + RECT focus; + GetWindowText(lpdis->hwndItem, text, 500); + if (wParam == IDC_URL || IDC_EMAIL) + { + FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_3DFACE)); + oldtext = SetTextColor(lpdis->hDC, RGB(0,0,255)); + DrawText(lpdis->hDC, text, strlen(text), &lpdis->rcItem, DT_CENTER|DT_VCENTER); + SetTextColor(lpdis->hDC, oldtext); + if (lpdis->itemState & ODS_FOCUS) + { + CopyRect(&focus, &lpdis->rcItem); + focus.left += 2; + focus.right -= 2; + focus.top += 1; + focus.bottom -= 1; + DrawFocusRect(lpdis->hDC, &focus); + } + return TRUE; + } + } + case WM_COMMAND: + if (LOWORD(wParam) == IDOK) + EndDialog(hDlg, TRUE); + if (HIWORD(wParam) == BN_DBLCLK) + { + if (LOWORD(wParam) == IDC_URL) + ShellExecute(NULL, "open", "http://www.unrealircd.com", NULL, NULL, + SW_MAXIMIZE); + else if (LOWORD(wParam) == IDC_EMAIL) + ShellExecute(NULL, "open", "mailto:unreal-users@lists.sourceforge.net", NULL, NULL, + SW_MAXIMIZE); + EndDialog(hDlg, TRUE); + return 0; + } + break; + case WM_CLOSE: + EndDialog(hDlg, TRUE); + break; + case WM_DESTROY: + DeleteObject(hFont); + break; + + } + return FALSE; +} + + + + + + + + +LRESULT CALLBACK StatusDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + hwTreeView = GetDlgItem(hDlg, IDC_TREE); + win_map(&me, hwTreeView, 0); + SetDlgItemInt(hDlg, IDC_CLIENTS, IRCstats.clients, FALSE); + SetDlgItemInt(hDlg, IDC_SERVERS, IRCstats.servers, FALSE); + SetDlgItemInt(hDlg, IDC_INVISO, IRCstats.invisible, FALSE); + SetDlgItemInt(hDlg, IDC_UNKNOWN, IRCstats.unknown, FALSE); + SetDlgItemInt(hDlg, IDC_OPERS, IRCstats.operators, FALSE); + SetDlgItemInt(hDlg, IDC_CHANNELS, IRCstats.channels, FALSE); + if (IRCstats.clients > IRCstats.global_max) + IRCstats.global_max = IRCstats.clients; + if (IRCstats.me_clients > IRCstats.me_max) + IRCstats.me_max = IRCstats.me_clients; + SetDlgItemInt(hDlg, IDC_MAXCLIENTS, IRCstats.global_max, FALSE); + SetDlgItemInt(hDlg, IDC_LCLIENTS, IRCstats.me_clients, FALSE); + SetDlgItemInt(hDlg, IDC_LSERVERS, IRCstats.me_servers, FALSE); + SetDlgItemInt(hDlg, IDC_LMAXCLIENTS, IRCstats.me_max, FALSE); + SetTimer(hDlg, 1, 5000, NULL); + return TRUE; + } + case WM_CLOSE: + DestroyWindow(hDlg); + return TRUE; + case WM_TIMER: + TreeView_DeleteAllItems(hwTreeView); + win_map(&me, hwTreeView, 1); + SetDlgItemInt(hDlg, IDC_CLIENTS, IRCstats.clients, FALSE); + SetDlgItemInt(hDlg, IDC_SERVERS, IRCstats.servers, FALSE); + SetDlgItemInt(hDlg, IDC_INVISO, IRCstats.invisible, FALSE); + SetDlgItemInt(hDlg, IDC_INVISO, IRCstats.invisible, FALSE); + SetDlgItemInt(hDlg, IDC_UNKNOWN, IRCstats.unknown, FALSE); + SetDlgItemInt(hDlg, IDC_OPERS, IRCstats.operators, FALSE); + SetDlgItemInt(hDlg, IDC_CHANNELS, IRCstats.channels, FALSE); + if (IRCstats.clients > IRCstats.global_max) + IRCstats.global_max = IRCstats.clients; + if (IRCstats.me_clients > IRCstats.me_max) + IRCstats.me_max = IRCstats.me_clients; + SetDlgItemInt(hDlg, IDC_MAXCLIENTS, IRCstats.global_max, FALSE); + SetDlgItemInt(hDlg, IDC_LCLIENTS, IRCstats.me_clients, FALSE); + SetDlgItemInt(hDlg, IDC_LSERVERS, IRCstats.me_servers, FALSE); + SetDlgItemInt(hDlg, IDC_LMAXCLIENTS, IRCstats.me_max, FALSE); + SetTimer(hDlg, 1, 5000, NULL); + return TRUE; + case WM_COMMAND: + if (LOWORD(wParam) == IDOK) + { + DestroyWindow(hDlg); + return TRUE; + } + break; + + } + return FALSE; +} + +/* This was made by DrBin but I cleaned it up a bunch to make it work better */ + +HTREEITEM AddItemToTree(HWND hWnd, LPSTR lpszItem, int nLevel, short remap) +{ + TVITEM tvi; + TVINSERTSTRUCT tvins; + static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; + static HTREEITEM hPrevLev[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; + HTREEITEM hti; + + if (remap) + { + hPrev = (HTREEITEM)TVI_FIRST; + memset(hPrevLev, 0, sizeof(HTREEITEM)*10); + } + + tvi.mask = TVIF_TEXT|TVIF_PARAM; + tvi.pszText = lpszItem; + tvi.cchTextMax = lstrlen(lpszItem); + tvi.lParam = (LPARAM)nLevel; + tvins.item = tvi; + tvins.hInsertAfter = hPrev; + if (nLevel == 1) + tvins.hParent = TVI_ROOT; + else + tvins.hParent = hPrevLev[nLevel-1]; + hPrev = (HTREEITEM)SendMessage(hWnd, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT) &tvins); + hPrevLev[nLevel] = hPrev; + TreeView_EnsureVisible(hWnd,hPrev); + if (nLevel > 1) + { + hti = TreeView_GetParent(hWnd, hPrev); + tvi.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE; + tvi.hItem = hti; + TreeView_SetItem(hWnd, &tvi); + } + return hPrev; +} + +/* + * Now used to create list of servers for server list tree view -- David Flynn + * Recoded by codemastr to be faster. + * I removed the Potvin credit because it no longer uses any original code and I don't + * even think Potvin actually made the original code + */ +void win_map(aClient *server, HWND hwTreeView, short remap) +{ + aClient *acptr; + Link *lp; + + AddItemToTree(hwTreeView,server->name,server->hopcount+1, remap); + + for (lp = Servers; lp; lp = lp->next) + { + acptr = lp->value.cptr; + if (acptr->srvptr != server) + continue; + win_map(acptr, hwTreeView, 0); + } +} + +/* ugly stuff, but hey it works -- codemastr */ +void win_log(unsigned char *format, ...) +{ + va_list ap; + unsigned char buf[2048]; + unsigned char *buf2; + va_start(ap, format); + ircvsprintf(buf, format, ap); + if (!IsService) + { + strcat(buf, "\r\n"); + if (errors) + { + buf2 = MyMalloc(strlen(errors)+strlen(buf)+1); + sprintf(buf2, "%s%s",errors,buf); + MyFree(errors); + errors = NULL; + } + else + { + buf2 = MyMalloc(strlen(buf)+1); + sprintf(buf2, "%s",buf); + } + errors = buf2; + } + else + { + FILE *fd = fopen("service.log", "a"); + fprintf(fd, "%s\n", buf); + fclose(fd); + } + va_end(ap); +} + +void win_error() +{ + if (errors && !IsService) + DialogBox(hInst, "ConfigError", hwIRCDWnd, (DLGPROC)ConfigErrorDLG); +} + +LRESULT CALLBACK ConfigErrorDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + MessageBeep(MB_ICONEXCLAMATION); + SetDlgItemText(hDlg, IDC_CONFIGERROR, errors); + MyFree(errors); + errors = NULL; + return (TRUE); + case WM_COMMAND: + if (LOWORD(wParam) == IDOK) + EndDialog(hDlg, TRUE); + break; + case WM_CLOSE: + EndDialog(hDlg, TRUE); + break; + case WM_DESTROY: + break; + + } + return (FALSE); +} diff --git a/src/win32/rtf.c b/src/win32/rtf.c new file mode 100644 index 000000000..230f0f34f --- /dev/null +++ b/src/win32/rtf.c @@ -0,0 +1,883 @@ +/************************************************************************ + * IRC - Internet Relay Chat, win32/rtf.c + * Copyright (C) 2004 Dominick Meglio (codemastr) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include "win32.h" +#include "sys.h" +#include "common.h" +#include "struct.h" +#include "h.h" + +unsigned char *RTFBuf; + +#define MIRC_COLORS "{\\colortbl;\\red255\\green255\\blue255;\\red0\\green0\\blue127;\\red0\\green147\\blue0;\\red255\\green0\\blue0;\\red127\\green0\\blue0;\\red156\\green0\\blue156;\\red252\\green127\\blue0;\\red255\\green255\\blue0;\\red0\\green252\\blue0;\\red0\\green147\\blue147;\\red0\\green255\\blue255;\\red0\\green0\\blue252;\\red255\\green0\\blue255;\\red127\\green127\\blue127;\\red210\\green210\\blue210;\\red0\\green0\\blue0;}" + +/* Splits the file up for the EM_STREAMIN message + * Parameters: + * dwCookie - The file information to split + * pbBuff - The output buffer + * cb - The size of pbBuff + * pcb - The total bytes written to bpBuff + * Returns: + * Returns 0 to indicate success + */ +DWORD CALLBACK SplitIt(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) +{ + StreamIO *stream = (StreamIO*)dwCookie; + if (*stream->size == 0) + { + pcb = 0; + *stream->buffer = 0; + } + else if (cb <= *stream->size) + { + memcpy(pbBuff, *stream->buffer, cb); + *stream->buffer += cb; + *stream->size -= cb; + *pcb = cb; + + } + else + { + memcpy(pbBuff, *stream->buffer, *stream->size); + *pcb = *stream->size; + *stream->size = 0; + } + return 0; +} + +/* Reassembles the RTF buffer from EM_STREAMOUT + * Parameters: + * dwCookie - Unused + * pbBuff - The input buffer + * cb - The length of the input buffer + * pcb - The total bytes read from pbBuff + * Returns: + * 0 to indicate success + * Side Effects: + * RTFBuf contains the assembled RTF buffer + */ +DWORD CALLBACK BufferIt(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) +{ + unsigned char *buf2; + static long size = 0; + if (!RTFBuf) + size = 0; + + buf2 = MyMalloc(size+cb+1); + + if (RTFBuf) + memcpy(buf2,RTFBuf,size); + + memcpy(buf2+size,pbBuff,cb); + + size += cb; + if (RTFBuf) + MyFree(RTFBuf); + + RTFBuf = buf2; + + pcb = &cb; + return 0; +} + +/* Pushes a color onto the stack + * Parameters: + * color - The color to add to the stack + * stack - The stack to add the color to + */ +void ColorPush(unsigned char *color, IRCColor **stack) +{ + IRCColor *t = MyMallocEx(sizeof(IRCColor)); + t->color = strdup(color); + t->next = *stack; + (*stack) = t; +} + +/* Pops a color off of the stack + * Parameters: + * stack - The stack to pop from + */ +void ColorPop(IRCColor **stack) +{ + IRCColor *p = *stack; + if (!(*stack)) + return; + MyFree(p->color); + + *stack = p->next; + MyFree(p); +} + +/* Completely empties the color stack + * Parameters: + * stack - The stack to empty + */ +void ColorEmpty(IRCColor **stack) +{ + IRCColor *t, *next; + for (t = *stack; t; t = next) + { + next = t->next; + MyFree(t->color); + MyFree(t); + } +} + +#define iseol(x) ((x) == '\r' || (x) == '\n') + +/* Converts a string in RTF format to IRC codes + * Parameters: + * fd - The file descriptor to write to + * pbBuff - The buffer containing the RTF text + * cb - The length of the RTF text + */ +DWORD CALLBACK RTFToIRC(int fd, unsigned char *pbBuff, long cb) +{ + unsigned char *buffer = malloc(cb*2); + int colors[17], bold = 0, uline = 0, incolor = 0, inbg = 0; + int lastwascf = 0, lastwascf0 = 0; + int i = 0; + + IRCColor *TextColors = NULL; + IRCColor *BgColors = NULL; + + bzero(buffer, cb); + + for (; *pbBuff; pbBuff++) + { + if (iseol(*pbBuff) || *pbBuff == '{' || *pbBuff == '}') + continue; + else if (*pbBuff == '\\') + { + /* RTF control sequence */ + pbBuff++; + if (*pbBuff == '\\' || *pbBuff == '{' || *pbBuff == '}') + buffer[i++] = *pbBuff; + else if (*pbBuff == '\'') + { + /* Extended ASCII character */ + unsigned char ltr, ultr[3]; + ultr[0] = *(++pbBuff); + ultr[1] = *(++pbBuff); + ultr[2] = 0; + ltr = strtoul(ultr,NULL,16); + buffer[i++] = ltr; + } + else + { + int j; + char cmd[128]; + /* Capture the control sequence */ + for (j = 0; *pbBuff && *pbBuff != '\\' && !isspace(*pbBuff) && + !iseol(*pbBuff); pbBuff++) + { + cmd[j++] = *pbBuff; + } + if (*pbBuff != ' ') + pbBuff--; + cmd[j] = 0; + if (!strcmp(cmd, "fonttbl{")) + { + /* Eat the parameter */ + while (*pbBuff && *pbBuff != '}') + pbBuff++; + lastwascf = lastwascf0 = 0; + } + if (!strcmp(cmd, "colortbl")) + { + char color[128]; + int k = 0, m = 1; + /* Capture the color table */ + while (*pbBuff && !isalnum(*pbBuff)) + pbBuff++; + for (; *pbBuff && *pbBuff != '}'; pbBuff++) + { + if (*pbBuff == ';') + { + color[k]=0; + if (!strcmp(color, "\\red255\\green255\\blue255")) + colors[m++] = 0; + else if (!strcmp(color, "\\red0\\green0\\blue0")) + colors[m++] = 1; + else if (!strcmp(color, "\\red0\\green0\\blue127")) + colors[m++] = 2; + else if (!strcmp(color, "\\red0\\green147\\blue0")) + colors[m++] = 3; + else if (!strcmp(color, "\\red255\\green0\\blue0")) + colors[m++] = 4; + else if (!strcmp(color, "\\red127\\green0\\blue0")) + colors[m++] = 5; + else if (!strcmp(color, "\\red156\\green0\\blue156")) + colors[m++] = 6; + else if (!strcmp(color, "\\red252\\green127\\blue0")) + colors[m++] = 7; + else if (!strcmp(color, "\\red255\\green255\\blue0")) + colors[m++] = 8; + else if (!strcmp(color, "\\red0\\green252\\blue0")) + colors[m++] = 9; + else if (!strcmp(color, "\\red0\\green147\\blue147")) + colors[m++] = 10; + else if (!strcmp(color, "\\red0\\green255\\blue255")) + colors[m++] = 11; + else if (!strcmp(color, "\\red0\\green0\\blue252")) + colors[m++] = 12; + else if (!strcmp(color, "\\red255\\green0\\blue255")) + colors[m++] = 13; + else if (!strcmp(color, "\\red127\\green127\\blue127")) + colors[m++] = 14; + else if (!strcmp(color, "\\red210\\green210\\blue210")) + colors[m++] = 15; + k=0; + } + else + color[k++] = *pbBuff; + } + lastwascf = lastwascf0 = 0; + } + else if (!strcmp(cmd, "tab")) + { + buffer[i++] = '\t'; + lastwascf = lastwascf0 = 0; + } + else if (!strcmp(cmd, "par")) + { + if (bold || uline || incolor || inbg) + buffer[i++] = '\17'; + buffer[i++] = '\r'; + buffer[i++] = '\n'; + if (!*(pbBuff+3) || *(pbBuff+3) != '}') + { + if (bold) + buffer[i++] = '\2'; + if (uline) + buffer[i++] = '\37'; + if (incolor) + { + buffer[i++] = '\3'; + strcat(buffer, TextColors->color); + i += strlen(TextColors->color); + if (inbg) + { + buffer[i++] = ','; + strcat(buffer, BgColors->color); + i += strlen(BgColors->color); + } + } + else if (inbg) + { + buffer[i++] = '\3'; + buffer[i++] = '0'; + buffer[i++] = '1'; + buffer[i++] = ','; + strcat(buffer, BgColors->color); + i += strlen(BgColors->color); + } + } + } + else if (!strcmp(cmd, "b")) + { + bold = 1; + buffer[i++] = '\2'; + lastwascf = lastwascf0 = 0; + } + else if (!strcmp(cmd, "b0")) + { + bold = 0; + buffer[i++] = '\2'; + lastwascf = lastwascf0 = 0; + } + else if (!strcmp(cmd, "ul")) + { + uline = 1; + buffer[i++] = '\37'; + lastwascf = lastwascf0 = 0; + } + else if (!strcmp(cmd, "ulnone")) + { + uline = 0; + buffer[i++] = '\37'; + lastwascf = lastwascf0 = 0; + } + else if (!strcmp(cmd, "cf0")) + { + lastwascf0 = 1; + lastwascf = 0; + } + else if (!strcmp(cmd, "highlight0")) + { + inbg = 0; + ColorPop(&BgColors); + buffer[i++] = '\3'; + if (lastwascf0) + { + incolor = 0; + ColorPop(&TextColors); + lastwascf0 = 0; + } + else if (incolor) + { + strcat(buffer, TextColors->color); + i += strlen(TextColors->color); + buffer[i++] = ','; + buffer[i++] = '0'; + buffer[i++] = '0'; + } + lastwascf = lastwascf0 = 0; + } + else if (!strncmp(cmd, "cf", 2)) + { + unsigned char number[3]; + int num; + incolor = 1; + strcpy(number, &cmd[2]); + num = atoi(number); + buffer[i++] = '\3'; + if (colors[num] < 10) + sprintf(number, "0%d", colors[num]); + else + sprintf(number, "%d", colors[num]); + ColorPush(number, &TextColors); + strcat(buffer,number); + i += strlen(number); + lastwascf = 1; + lastwascf0 = 0; + } + else if (!strncmp(cmd, "highlight", 9)) + { + int num; + unsigned char number[3]; + inbg = 1; + num = atoi(&cmd[9]); + if (colors[num] < 10) + sprintf(number, "0%d", colors[num]); + else + sprintf(number, "%d", colors[num]); + if (incolor && !lastwascf) + { + buffer[i++] = '\3'; + strcat(buffer, TextColors->color); + i += strlen(TextColors->color); + } + else if (!incolor) + { + buffer[i++] = '\3'; + buffer[i++] = '0'; + buffer[i++] = '1'; + } + buffer[i++] = ','; + strcat(buffer, number); + i += strlen(number); + ColorPush(number, &BgColors); + lastwascf = lastwascf0 = 0; + } + else + lastwascf = lastwascf0 = 0; + + if (lastwascf0 && incolor) + { + incolor = 0; + ColorPop(&TextColors); + buffer[i++] = '\3'; + } + } + } + else + { + lastwascf = lastwascf0 = 0; + buffer[i++] = *pbBuff; + } + + } + write(fd, buffer, i); + close(fd); + ColorEmpty(&TextColors); + ColorEmpty(&BgColors); + return 0; +} + +/* Determines the size of the buffer needed to convert IRC codes to RTF + * Parameters: + * buffer - The input buffer with IRC codes + * Returns: + * The lenght of the buffer needed to store the RTF translation + */ +int CountRTFSize(unsigned char *buffer) { + int size = 0; + char bold = 0, uline = 0, incolor = 0, inbg = 0, reverse = 0; + char *buf = buffer; + + for (; *buf; buf++) + { + if (*buf == '{' || *buf == '}' || *buf == '\\') + size++; + else if (*buf == '\r') + { + if (*(buf+1) && *(buf+1) == '\n') + { + buf++; + if (bold) + size += 3; + if (uline) + size += 7; + if (incolor && !reverse) + size += 4; + if (inbg && !reverse) + size += 11; + if (reverse) + size += 15; + if (bold || uline || incolor || inbg || reverse) + size++; + bold = uline = incolor = inbg = reverse = 0; + size +=6; + continue; + } + } + else if (*buf == '\n') + { + if (bold) + size += 3; + if (uline) + size += 7; + if (incolor && !reverse) + size += 4; + if (inbg && !reverse) + size += 11; + if (reverse) + size += 15; + if (bold || uline || incolor || inbg || reverse) + size++; + bold = uline = incolor = inbg = reverse = 0; + size +=6; + continue; + } + else if (*buf == '\2') + { + if (bold) + size += 4; + else + size += 3; + bold = !bold; + continue; + } + else if (*buf == '\3' && reverse) + { + if (*(buf+1) && isdigit(*(buf+1))) + { + ++buf; + if (*(buf+1) && isdigit(*(buf+1))) + ++buf; + if (*(buf+1) && *(buf+1) == ',') + { + if (*(buf+2) && isdigit(*(buf+2))) + { + buf+=2; + if (*(buf+1) && isdigit(*(buf+1))) + ++buf; + } + } + } + continue; + } + else if (*buf == '\3' && !reverse) + { + size += 3; + if (*(buf+1) && !isdigit(*(buf+1))) + { + incolor = 0; + size++; + if (inbg) + { + inbg = 0; + size += 11; + } + } + else if (*(buf+1)) + { + unsigned char color[3]; + int number; + color[0] = *(++buf); + color[1] = 0; + if (*(buf+1) && isdigit(*(buf+1))) + color[1] = *(++buf); + color[2] = 0; + number = atoi(color); + if (number == 99 || number == 1) + size += 2; + else if (number == 0) + size++; + else { + number %= 16; + _itoa(number, color, 10); + size += strlen(color); + } + color[2] = 0; + number = atoi(color); + if (*(buf+1) && *(buf+1) == ',') + { + if (*(buf+2) && isdigit(*(buf+2))) + { + size += 10; + buf++; + color[0] = *(++buf); + color[1] = 0; + if (*(buf+1) && isdigit(*(buf+1))) + color[1] = *(++buf); + color[2] = 0; + number = atoi(color); + if (number == 1) + size += 2; + else if (number == 0 || number == 99) + size++; + else + { + number %= 16; + _itoa(number, color, 10); + size += strlen(color); + } + inbg = 1; + } + } + incolor = 1; + } + size++; + continue; + } + else if (*buf == '\17') + { + if (bold) + size += 3; + if (uline) + size += 7; + if (incolor && !reverse) + size += 4; + if (inbg && !reverse) + size += 11; + if (reverse) + size += 15; + if (bold || uline || incolor || inbg || reverse) + size++; + bold = uline = incolor = inbg = reverse = 0; + continue; + } + else if (*buf == '\26') + { + if (reverse) + size += 16; + else + size += 17; + reverse = !reverse; + continue; + } + else if (*buf == '\37') + { + if (uline) + size += 8; + else + size += 4; + uline = !uline; + continue; + } + size++; + } + size += strlen("{\\rtf1\\ansi\\ansicpg1252\\deff0{\\fonttbl{\\f0\\fmodern\\fprq1\\" + "fcharset0 Fixedsys;}}\r\n" + MIRC_COLORS + "\\viewkind4\\uc1\\pard\\lang1033\\f0\\fs20")+1; + return (size); +} + +/* Converts a string containing IRC codes to RTF + * Parameters: + * buffer - The input buffer containing IRC codes + * string - The output buffer in RTF + */ +void IRCToRTF(unsigned char *buffer, unsigned char *string) +{ + unsigned char *tmp; + int i = 0; + short bold = 0, uline = 0, incolor = 0, inbg = 0, reverse = 0; + sprintf(string, "{\\rtf1\\ansi\\ansicpg1252\\deff0{\\fonttbl{\\f0\\fmodern\\fprq1\\" + "fcharset0 Fixedsys;}}\r\n" + MIRC_COLORS + "\\viewkind4\\uc1\\pard\\lang1033\\f0\\fs20"); + i = strlen(string); + for (tmp = buffer; *tmp; tmp++) + { + if (*tmp == '{') + { + strcat(string, "\\{"); + i+=2; + continue; + } + else if (*tmp == '}') + { + strcat(string, "\\}"); + i+=2; + continue; + } + else if (*tmp == '\\') + { + strcat(string, "\\\\"); + i+=2; + continue; + } + else if (*tmp == '\r') + { + if (*(tmp+1) && *(tmp+1) == '\n') + { + tmp++; + if (bold) + { + strcat(string, "\\b0 "); + i+=3; + } + if (uline) + { + strcat(string, "\\ulnone"); + i+=7; + } + if (incolor && !reverse) + { + strcat(string, "\\cf0"); + i+=4; + } + if (inbg && !reverse) + { + strcat(string, "\\highlight0"); + i +=11; + } + if (reverse) { + strcat(string, "\\cf0\\highlight0"); + i += 15; + } + if (bold || uline || incolor || inbg || reverse) + string[i++] = ' '; + bold = uline = incolor = inbg = reverse = 0; + strcat(string, "\\par\r\n"); + i +=6; + } + else + string[i++]='\r'; + continue; + } + else if (*tmp == '\n') + { + if (bold) + { + strcat(string, "\\b0 "); + i+=3; + } + if (uline) + { + strcat(string, "\\ulnone"); + i+=7; + } + if (incolor && !reverse) + { + strcat(string, "\\cf0"); + i+=4; + } + if (inbg && !reverse) + { + strcat(string, "\\highlight0"); + i +=11; + } + if (reverse) { + strcat(string, "\\cf0\\highlight0"); + i += 15; + } + if (bold || uline || incolor || inbg || reverse) + string[i++] = ' '; + bold = uline = incolor = inbg = reverse = 0; + strcat(string, "\\par\r\n"); + i +=6; + continue; + } + else if (*tmp == '\2') + { + if (bold) + { + strcat(string, "\\b0 "); + i+=4; + } + else + { + strcat(string, "\\b "); + i+=3; + } + bold = !bold; + continue; + } + else if (*tmp == '\3' && reverse) + { + if (*(tmp+1) && isdigit(*(tmp+1))) + { + ++tmp; + if (*(tmp+1) && isdigit(*(tmp+1))) + ++tmp; + if (*(tmp+1) && *(tmp+1) == ',') + { + if (*(tmp+2) && isdigit(*(tmp+2))) + { + tmp+=2; + if (*(tmp+1) && isdigit(*(tmp+1))) + ++tmp; + } + } + } + continue; + } + else if (*tmp == '\3' && !reverse) + { + strcat(string, "\\cf"); + i += 3; + if (*(tmp+1) && !isdigit(*(tmp+1))) + { + incolor = 0; + string[i++] = '0'; + if (inbg) + { + inbg = 0; + strcat(string, "\\highlight0"); + i += 11; + } + } + else if (*(tmp+1)) + { + unsigned char color[3]; + int number; + color[0] = *(++tmp); + color[1] = 0; + if (*(tmp+1) && isdigit(*(tmp+1))) + color[1] = *(++tmp); + color[2] = 0; + number = atoi(color); + if (number == 99 || number == 1) + { + strcat(string, "16"); + i += 2; + } + else if (number == 0) + { + strcat(string, "1"); + i++; + } + else + { + number %= 16; + _itoa(number, color, 10); + strcat(string, color); + i += strlen(color); + } + if (*(tmp+1) && *(tmp+1) == ',') + { + if (*(tmp+2) && isdigit(*(tmp+2))) + { + strcat(string, "\\highlight"); + i += 10; + tmp++; + color[0] = *(++tmp); + color[1] = 0; + if (*(tmp+1) && isdigit(*(tmp+1))) + color[1] = *(++tmp); + color[2] = 0; + number = atoi(color); + if (number == 1) + { + strcat(string, "16"); + i += 2; + } + else if (number == 0 || number == 99) + string[i++] = '1'; + else + { + number %= 16; + _itoa(number, color, 10); + strcat(string,color); + i += strlen(color); + } + inbg = 1; + } + } + incolor=1; + } + string[i++] = ' '; + continue; + } + else if (*tmp == '\17') { + if (uline) { + strcat(string, "\\ulnone"); + i += 7; + } + if (bold) { + strcat(string, "\\b0"); + i += 3; + } + if (incolor && !reverse) { + strcat(string, "\\cf0"); + i += 4; + } + if (inbg && !reverse) + { + strcat(string, "\\highlight0"); + i += 11; + } + if (reverse) { + strcat(string, "\\cf0\\highlight0"); + i += 15; + } + if (uline || bold || incolor || inbg || reverse) + string[i++] = ' '; + uline = bold = incolor = inbg = reverse = 0; + continue; + } + else if (*tmp == '\26') + { + if (reverse) + { + strcat(string, "\\cf0\\highlight0 "); + i += 16; + } + else + { + strcat(string, "\\cf1\\highlight16 "); + i += 17; + } + reverse = !reverse; + continue; + } + + else if (*tmp == '\37') { + if (uline) { + strcat(string, "\\ulnone "); + i += 8; + } + else { + strcat(string, "\\ul "); + i += 4; + } + uline = !uline; + continue; + } + string[i++] = *tmp; + } + strcat(string, "}"); + return; +} diff --git a/src/win32/service.c b/src/win32/service.c index 9e50220ff..3ac88858f 100644 --- a/src/win32/service.c +++ b/src/win32/service.c @@ -1,6 +1,6 @@ /************************************************************************ * IRC - Internet Relay Chat, win32/service.c - * Copyright (C) 2002 Dominick Meglio (codemastr) + * Copyright (C) 2002-2004 Dominick Meglio (codemastr) * * 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 @@ -27,22 +27,48 @@ #include SERVICE_STATUS IRCDStatus; -SERVICE_STATUS_HANDLE IRCDStatusHandle; +SERVICE_STATUS_HANDLE IRCDStatusHandle; + +/* Signal to rehash */ #define IRCD_SERVICE_CONTROL_REHASH 128 BOOL IsService = FALSE; extern OSVERSIONINFO VerInfo; #define WIN32_VERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 - -VOID WINAPI IRCDCtrlHandler(DWORD opcode) { + +/* Places the service in the STOPPED state + * Parameters: + * code - The error code (or 0) + */ +void SetServiceStop(int code) +{ + IRCDStatus.dwCurrentState = SERVICE_STOPPED; + IRCDStatus.dwCheckPoint = 0; + IRCDStatus.dwWaitHint = 0; + IRCDStatus.dwWin32ExitCode = code; + IRCDStatus.dwServiceSpecificExitCode = code; + SetServiceStatus(IRCDStatusHandle, &IRCDStatus); +} + +/* Handles the service messages + * Parameters: + * opcode - The message to process + */ +VOID WINAPI IRCDCtrlHandler(DWORD opcode) +{ DWORD status; int i; aClient *acptr; - if (opcode == SERVICE_CONTROL_STOP) { + + /* Stopping */ + if (opcode == SERVICE_CONTROL_STOP) + { IRCDStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(IRCDStatusHandle, &IRCDStatus); - for (i = 0; i <= LastSlot; i++) { + + for (i = 0; i <= LastSlot; i++) + { if (!(acptr = local[i])) continue; if (IsClient(acptr)) @@ -56,91 +82,66 @@ VOID WINAPI IRCDCtrlHandler(DWORD opcode) { for (i = LastSlot; i >= 0; i--) if ((acptr = local[i]) && DBufLength(&acptr->sendQ) > 0) (void)send_queued(acptr); - IRCDStatus.dwWin32ExitCode = 0; - IRCDStatus.dwCurrentState = SERVICE_STOPPED; - IRCDStatus.dwCheckPoint = 0; - IRCDStatus.dwWaitHint = 0; - SetServiceStatus(IRCDStatusHandle, &IRCDStatus); + SetServiceStop(0); } - else if (opcode == IRCD_SERVICE_CONTROL_REHASH) { + /* Rehash */ + else if (opcode == IRCD_SERVICE_CONTROL_REHASH) rehash(&me,&me,0); - } - SetServiceStatus(IRCDStatusHandle, &IRCDStatus); + SetServiceStatus(IRCDStatusHandle, &IRCDStatus); } -VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { +/* Entry point function + * Parameters: + * dwArgc - Argument count + * lpszArgv - Arguments + */ +VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) +{ WSADATA WSAData; DWORD error = 0; char path[MAX_PATH], *folder; + IsService = TRUE; + + /* Initialize the service structure */ IRCDStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; IRCDStatus.dwCurrentState = SERVICE_START_PENDING; IRCDStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; IRCDStatus.dwWin32ExitCode = NO_ERROR; IRCDStatus.dwServiceSpecificExitCode = 0; IRCDStatus.dwCheckPoint = 0; - IRCDStatus.dwWaitHint = 0; + IRCDStatus.dwWaitHint = 0; + GetModuleFileName(NULL,path,MAX_PATH); folder = strrchr(path, '\\'); *folder = 0; chdir(path); - IRCDStatusHandle = RegisterServiceCtrlHandler("unreal", IRCDCtrlHandler); + + /* Register the service controller */ + IRCDStatusHandle = RegisterServiceCtrlHandler("UnrealIRCd", IRCDCtrlHandler); + VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&VerInfo); - strcpy(OSName, "Windows "); - if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { - if (VerInfo.dwMajorVersion == 4) { - if (VerInfo.dwMinorVersion == 0) { - strcat(OSName, "95 "); - if (!strcmp(VerInfo.szCSDVersion," C")) - strcat(OSName, "OSR2 "); - } - else if (VerInfo.dwMinorVersion == 10) { - strcat(OSName, "98 "); - if (!strcmp(VerInfo.szCSDVersion, " A")) - strcat(OSName, "SE "); - } - else if (VerInfo.dwMinorVersion == 90) - strcat(OSName, "Me "); - } - } - else if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { - if (VerInfo.dwMajorVersion == 3 && VerInfo.dwMinorVersion == 51) - strcat(OSName, "NT 3.51 "); - else if (VerInfo.dwMajorVersion == 4 && VerInfo.dwMinorVersion == 0) - strcat(OSName, "NT 4.0 "); - else if (VerInfo.dwMajorVersion == 5) { - if (VerInfo.dwMinorVersion == 0) - strcat(OSName, "2000 "); - else if (VerInfo.dwMinorVersion == 1) - strcat(OSName, "XP "); - else if (VerInfo.dwMinorVersion == 2) - strcat(OSName, "Server 2003 "); - } - strcat(OSName, VerInfo.szCSDVersion); - } - if (OSName[strlen(OSName)-1] == ' ') - OSName[strlen(OSName)-1] = 0; + GetOSName(VerInfo, OSName); + InitDebug(); - if ((error = WSAStartup(MAKEWORD(1, 1), &WSAData)) != 0) { - IRCDStatus.dwCurrentState = SERVICE_STOPPED; - IRCDStatus.dwCheckPoint = 0; - IRCDStatus.dwWaitHint = 0; - IRCDStatus.dwWin32ExitCode = error; - IRCDStatus.dwServiceSpecificExitCode = error; - SetServiceStatus(IRCDStatusHandle, &IRCDStatus); + + /* Initialize Winsocks */ + if ((error = WSAStartup(MAKEWORD(1, 1), &WSAData)) != 0) + { + SetServiceStop(error); return; } - if ((error = InitwIRCD(dwArgc, lpszArgv)) != 1) { - IRCDStatus.dwCurrentState = SERVICE_STOPPED; - IRCDStatus.dwCheckPoint = 0; - IRCDStatus.dwWaitHint = 0; - IRCDStatus.dwWin32ExitCode = error; - IRCDStatus.dwServiceSpecificExitCode = error; - SetServiceStatus(IRCDStatusHandle, &IRCDStatus); + + /* Initialize the IRCd */ + if ((error = InitwIRCD(dwArgc, lpszArgv)) != 1) + { + SetServiceStop(error); return; - } + } + + /* Go into the running state */ IRCDStatus.dwCurrentState = SERVICE_RUNNING; IRCDStatus.dwCheckPoint = 0; IRCDStatus.dwWaitHint = 0; diff --git a/src/win32/tre.dll b/src/win32/tre.dll index 5843a53dada09aa8394d21dd3e06b2b64d929fc6..58e21da790088ac182cf418be27261d2687464cb 100644 GIT binary patch literal 151552 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 Ab^rhX literal 114688 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 diff --git a/src/win32/tre.lib b/src/win32/tre.lib index 0831f569045e6181c8c66c013676972dad27ee01..7ef5a8eae2c46536516b685909cb8210fbcf47c5 100644 GIT binary patch literal 3798 zcmb_f%~BIV5dH{YAV7$q2Y)M8anK9$69QCOR8XuEjc6g9mnGRi%0N=fPjSK*@Ci8j z03I!lc=h1H^6Uff2$q(1&rHuQYZ6^#t2#5&J-grZ^w&L;I}cpHv^kf$pFR7GkIm-C zCub+}<7f3_W;ivIH@&qKfLlQKZ6G-V^wfafV=bxcfRa;cN&1RL-cw7`pE2T7%kouA z>X7D>q#IfW@&HS^OUu9!jgK5>@%hUa%PY>p<5!QC7hkTtSax=O50106S}gu)#2d0| z+sc#GrDx8<{K`Ddu5L9P$M-f|@4zb|)C(-zfys2OtyJG?sF!rd>OJ4D`^sQ?fkj~S zN3Fi%d$f33i0)YZwuLagz+#sbU6tE#eRpfeDSH)nuePhbit6-tcvJR0f2UgC2Jc@m z2<)Z$cBQ(Z&C(C7o9@2nth=SxzE|1NlOn3fT({Bi>j$BkMiHBZvjGc##Y5*M<;%M zT%GUgpqfa$Vrq?+z4g6~kym;M%u(m93`|=<=HY0y?C!cF6JokTolhj+jG~j;0>)0v zJgSWPVVoZ%GLN+dWKR;*risb?B#l#dF`S`P0e_1h?tdQ{dR{I0^__ZUH+y&aUbeWn z^h{Z!Ka@b~O@52=ha^cELZ^W083+_Oj{M>n@tnba`{+GNj7~U1RdGtd)6kKEESl4oK4{; zlubF&^SsY8Fzv@DTOJ^_chMNVh2~JAwr-6rSAu-ic0Rrjn?F> zA$SB~n7+;tQ}-%e^#vlf7r7Q*aNZ9JM&vjVu-N`c!bbeLOgLPX*dKLF2|#Rb+Qo#q z#|ZlT6NroSfh)B_;B!>~;``8Mmo6Cubzq+#p+(G@xqSMt5Beq`5V3cu4FaF23gN$U zBPV~GB3$C?&3sbVZgbT-uNS$g=K04pgmX|~gl|Lw6g%ejD2sS=gHSjs0g}CHogYh% SfC$!A!r}Xd!je0jMfnY{tzW|c delta 598 zcmZ{gzfZzI6vw}{z4qEdY(Ow6{@OME0BML5GXpv}IGCuIMkWU)2Oazm49|g~F76Tu zi802>zrca`2k64;;^5>f1qBRu`Q+W@bMM`|dz=4GUAeN5=jr7Ov=dM7=kl9N(KxgK zBmuPyh$^55fYFVRC7?%>BV#&!Y8*p45taw^XmD(_o)e0@)-OK@8|%aO`#JCLew!O8 zt3Xu%fev&Hpd^7N@(~G*BtobKL z{+WM_gK%{kE~&0<(XE-H1(6v3o>|%!(`M!4v8XBhaJn=y^eQv$8*!%$pG#BKa71|S zfm(8r0^@yD2h!0(-M*LZSmwDs(^GY8Wi+Q`MS?2U>ZmEk`X+0S0< NVw0*pO*C_H_XlA{hr$2= diff --git a/src/win32/unreal.c b/src/win32/unreal.c index a75db6dd0..0e5aee14b 100644 --- a/src/win32/unreal.c +++ b/src/win32/unreal.c @@ -21,8 +21,10 @@ #include #include static OSVERSIONINFO VerInfo; +typedef BOOL (*UCHANGESERVICECONFIG2)(SC_HANDLE, DWORD, LPVOID); HMODULE hAdvapi; -BOOL (*uChangeServiceConfig2)(); +UCHANGESERVICECONFIG2 uChangeServiceConfig2; + #define IRCD_SERVICE_CONTROL_REHASH 128 void show_usage() { fprintf(stderr, "unreal start|stop|rehash|restart|install|uninstall|config

    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⪼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%0D3x5Tp=HUwQ#jV-`uHR|2oVJXhNa=Zxe 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 H01zDj0dDTS literal 404346 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�SSV%9M z$N)sqk8p_6DU2uO2{7J4`+Bh(l$x;be%@5UT>>$Dp|bbHX9p*Uz9IxkiIOn$i=lCMsl*WzTP^huX)1yH;hFRpDkdD$RNw}EbjPAK)Yl>usITx{~ zI!&aI-hieVd5uXjCixnz3OWL4PXTMYfzqy{mq)MZ%@q~I2Z)q1Ksz(eW1|?NIOQ7B zTN}*Y1>AXhc%DS}?r(kfKs~-zx$p<=9jss@`gZ%f9i++f_G_h*c>A3sLs)GjWWs(@ z%@1qp1eS0fJGQ27BFr{U{4WRg!lcbCHjy3@|~ zlqBSvt8g852}DF>p<_y}QQ1fqbb9R)a9>Ibo#T8Q1Bp{XB2p98XBUz zsTtPQsIIbAlopU%>5D;D2O4;h3}u9P`>j$fC2q_k0%f8dqYbR~^$|_O0W8Nyq028H zb9w2eK>3*=nd#|%1XNzWHp}Pa=+ftBHFY1EsmhpZ@mo?Jrqxy;=!_*=zGUY zsYCk0k(-I=?SwaJbze~K@Y&C`h5eyiuwZe=xJ}CHvab$xaUgFX%o#3%=;SQRfQHzk zsD06FOQy%nb0Hmm~D+ff)7R3<+ z%EN-DpZGe5@{sI`*piIphbT&hBi*EeB?U79FHqQVx=BmSJoUK7M~|X!+FQ)Zp3y&) zi}@P8g0MtGs*siHms5U!LGStgh>Q}NzA}G;QlUM~Wf~SJG4So8_^nqe>0;06**5o# z50R=K6iO#ca?Eu#iN_IXX_;}Gk$k2T?Nt`kZnx=lr?0ly!h85tvy#Ne|7y8mK)`ZK z%Eb2^RH)dG+t5w;vjcxRO)?-j!QZ?5`aZqpWA0Y;?31V&TW4*E9OgDu>~mbCiMjX; zH)%ckL`q~S>Bd97T0f*)^+UN(m*o`xb^O+s?CE5NurG!lzrx=oUBzP-C^M^Fvc8E) zDa>WCW*CO#M9EdgdkMEjGYay1JY>A!+I>E(R-*$T{1Gs1x9e-#_%FxNl3LOke%o@-~7J$cD?ao^8+(B%!OSWZQ!-Z^`}1>E#M+8 zGC;1p( z89ElIiL=hDB3L*V%zT?ePZtnWwlW(DGrb6Ks;^Yww}hP6402%lcI!u^S13**z_xWvl6{sw_5bZ z#@c;E+&ZM&um;Tr;YYCwNx0-Yh^~q`Qd}CYP!e~fI)Vtz7FUqm_<*R zT(pRnyknMsTBMt3?W9=|uA(isEI>T%>2r!S~Vs!hOY?%e3dDmFY#B4uzwi zj`v}cVnUR;PR>zBo{3Qu8fC#N6{xkcwNiazF%xN_b5a;*KD0AA8^KJ8j27#tyZNBG z^u6$|!Oe4uBug9VbS-ktR8-r}hk(_+Kb67wW0vAQN6$m#EgU(bx~3)Zq(>Y*4$jG5 zQ>7>*?uOPtN9cYN8PfnV{2GhTtgi+mEf_PyvAg>78S0GSzS7%6{&({vl}}O2gtxYkbJo z0l)>}Uh>mTZy^l$6ul%Db5*8e@iXZUvw!=t!M74emE zS?eFWuvfxsI-K4=r`$#BELoEERxDduw7lF-dN=3e7+C+-3>REy8~!<|(^7_Gc7li9 zY?S`-*;a77bRO|p`epQGrxSg7Zb&=zLS&)T-W9XSO4=lW#s8 zOUR=pJw3beJy9)g;jipPY@8mf$+YkB;P_+|eTe_+`VeDY^bbe|gBF`FAzsc!DjvGa%qh^ezCS8>dh;(!4${XNrLhhzMf(c52Ab5y-jv+_Vgw?M`u~I z86!7ju`xRr6*yec#xOQ$V|R)=buxjZWDRUb&(DI z-k?!)bT*re*!LPOpMfvQs8+ehifYx)_K0yZkz@-59m}5WIsncIjr|!%23>{i6w9al zB4(#*u~g`DfREVe)dbss*K9I?M83Ss8aV>J{h9*3Qf}b5d`{^arbNKY| z*(;PbJ%g9g;a}lbbo|S~lP6eP4W%xRo!O_!= z=<&hRgP*ZUFQey>?51!!m{%z7T9yD;+Gnujg_nu+W^ZE1@b ziP@0)jBDliC$T5U4GL+K(1Z8a*iZ3la z-{6j;OAe0I2}*OCj9AbE!ZDc*^l<4-5_X)9)q!v@pfTn1jMAi72Hj57Ujkhu)G|r- zsoO}>T>-D2qDPW3W%}{>u_;#%N5$2Xkwub4%BkK2@grG0YkV3tGa6g)_@QqDvTS%; zbI3L^mn4H^3uio6o*y@JQ-U1Q455G*n#a$NUZE2JC0d)*w@ATtIs* zF|WVh-o>6FNlfC&0DU=$(arJNBmR9bgzZ{COQ-ww#(S-+^^u%Y(RBis@M)e65U~L7 zIJsaMND+*Sd4UcxBSyl&L=PkK5kb4?%Qkv|VRwd?*f*@^>0ham;U!c9cVKz@=mov) zjq&XToKoh)FHfI8=5P3#KEoBjet!PjGx-d!>GS!-7W>Q3FQsIB4WHTMP(B~OdU?d3 z={0u$cr}09x39XuM(o#chI_+4 z15cbE%ukbHklCw!ws$+bHF*tk#g!^w!+E(AZKB82$ z+7XixirGQtQX6KmYn`y9rP>WP%ExW5A5U*Ao~4wu`ms- z(|tH-o*l!f_4LPs+F=Ac;V|N~uwX)IF$E;e z@bG&nN%6uQNQx;SX>J-%E3A}KyKD9h_IPRsw8m%|;(woy2k4=8L45UK%+%)^sf@wW zu*viVnt3}Z!(bS6luXjTk6|njA*5q9dp$BVBQoS6VgeJH%^NWtig=qxh7#0ZJ3E5k z7OIlARh8s{mP8ROto601y!l1hv2FDnkaBZVjIxWu*@&2qbTms)+Ck;^c;VrumX)|{ z&i-1YTYfs3CCg@mm2OB)y_bT? zOF+*KRcWHGi@2=D4^Wp%kXMX~C35Yzs1YbxGoIQjTzlgOjpvjM$J3iVj^w03N^1Pk zAfSkqpe{s;m9L&QWQDXjEA}6aL5f7C{g~ZJyhhznb=V|U(x%qf2GPaH; z%EBT6gPV>BfdEOA1W!x)?RuopM@9rHit{5hLVNxnG?6&zCl0UP>Nm|*!iBCdwhHLq zJszV2J+2?al$$F#+>@QfVk``{2-bp7CMMW-D)Pkyt~2O@v^Gyn4$Ocx@6!s{T$=kGV zWNvCslvv}C(^!jwQJ|XcvB+eWYn^L$w=~zq<3)$;3l`l&KHB*Dt}pMrfwW7O>M>p^ zWcA`KS7*T*v(UnR@V0rebl4CMF$wO7U=_4FxM&%YCDx~|P{?P44B{Ha(qN6^dsoGz zPN`>J8%b|(Sk?^!4-f!kySK3w55+|mb^LbT`q_+v;sIg3U~6hjlb!>G5_9SWYh1g& zd7>PPOyG%K!m709`!l)k(nzctD7NI@*m#(4Z1SJq z8yoEnHnjGldKwTAXXq@W&(>3I&UO4QML(1&3G2vc8A+XiJDQ=sm8Q3>g=5K>3$KplBv0i5PBDW;_>_ttoZ}3EcbW9xJ!sON(3E zAJ>?_dKi6_j@nWAQBq@of%Tf~dsJ!M(NkH*uL-ImIUN}~d7hG?oN5C>-41^zLn zrx=LFaU9p9cZ%DD3EO5D7kj(W=!%z~_iZwyFY4-w{)X5);NnLVcIP5PX}Z=<96n1C z7^47^H}O1}?TuPg*igCmsjZN;F4;&3q}}tyrYaA5XmT`NDV2uq0(kkd@^M|h{sT0V7jZhg>JBm;?Nx7 z6u=>qY*L1sd1^Fy^}>h*xnQ?Pw`&f<^RD3$RP$8SH!kF(EWu zG}K0q8=jLv-{>M-25KPIqYNG?M#K{l*`bjsnUS#u0d@;>FSF4g9lb+bpk#1{j)YDe zZ3K+#JJ!f;Zy>Ojgl+5 z2Q$JaLtY9`px*7X9vZ=&%?1M@Kko}{j8X)oH--!rc^RG(61|5rL_2@k>?fC-BdEwB z@pd{%MqiQF(4opg-lLeo-g+2(Qzs^y=t)>En&QJn!pLk32{R=t6XP6ZQMBiCHsv+v z9J&KT;U;Li;L3GeO2?gd32(8X#34~n3vER{fTbs_`sY5?u5-hmW9t@1u>v{4f$84E^a%^m8@=S^@m&^dIT@y9D<3pU>eH0f5J8 zdkCCi(x3f>s(oM$1pbFcq0lN!qye(jDu$&91*KU1^r#eg3PUOXbx|pBWHB?IYQ#=UnKtJT;7rNB!-tMYt?j+q84 zu#GUJ^5gzj8xdR9=FvMKuw))2hDU5w6Nx()LRrGt)$@zGiE5|#X&g6~7Cyf2zJBp@ z7%W*8Sbw0{5~gxHx`(#$0{zI7jTSmtu1Xk#0UtGB(cs!7;J35chzyTN9J-;(H^+*N zY%w`ayN2V4qN{yiG3&~1*~E6K?@>}m)m?9BUKCR{jt?JGG%uQqlNwst3*eXLqvC%a zWT!r-b@=+|RrmPUM~{F4>~HbUpAL?m{QB~6f4f$ba1{IIq^rF+c=R6!KOgRkTT1P( zhcAzhoz0>~gJ{>Nb@c-Le(e{JAop0d( z*PuywToHzeg4`30U>`d&g22u?IQ6d^+vqj+y44zGE!gMRNzVbRf1Kt$TxSH6Zc`9= zKby>|cDHRDT9ZMb@H3b^T(vE%-l^b#kh#(kIjX3Yu|V*rQ`&2%2)ukYCF6-2a`tWo zC-zx?v)!OusJ%r1ZzVsExz zr$1=j1&^0x=rtMc*GY)Q@gtx=WU`!2XV!rjtIY|dIg2LQDT-wNm}OHD>r9CNlJW@k zWN3{Igd=v45U3DjJ@`5eZxO#+XbLNzT38@f4#awN4rl9Y7+Nx@JAC}HPI`&$eDn9$ zo14uVeCbm1E;V(ZU>DzXIwze@z0raH-geeD;m`Kwc@rrkPUhi{j~>IAAnN7uqoX4Z zkiewo;KLN&!kXRP+HRhZ7VcmT;kh`=DY+J~XaeT%_{Gk%C;N5u*zLg0qzQjUO}uM9 zd$M!3(t? zjb>>ckAw?}T3GPabvADjN=iM|g6_0}Sj#X(TFpE>3%Ra7bVmAnaC8 zkNmOt_YoJ5#;zj3vF_z~)osHv!D{y(MfV^jtjU|`_|bEO;74q_Tx>o`!bB%p&XRbB z5$w-!MTi_ek?=&;*Y-X4<11+1N8GLO*KANMxy#>SDe*)7q4a$J5nj>hy23ATAG+m2 zi|3Sz{ed#!50*&1v*p20iCSy5k4HZp1NA573fLtw7?w?6+lxpI2xrPl4TzA_3c6W! z^lAE5>>6qLhAMhB;Vh!4YHjK*gK#Y?LpRQY_=Qk(OdF*`f;;f%XS9( z(Y(eqgKQHC<}&{wStW+f@J`SN0>x$r6xE0eM%pP4;wjE8qh1S(I;;tA)xAnbyE{19 za9E?Y!76N)>1@Kxqf8t{J;sS7=DP{Wn#A5eOXzMg$cWoL&&U8=l*#LecDo)ue)5E5 zuz1D7<&3Ke12D(hzF0U^(;?TvxS7P$CJW-l{--8z``F9bSZ-~2Xg9EJT{^eAs%avr zEn17VYo)&4TO(1c^Qw!z+^^+8`GZZ7*TE* zHJ<C`$>F&1=?zPvc zEoiR-L}4$&muufQBd07+g3Y}h4QZ6QRnMMcgYXV<9kmX)WgT>*CU0J9-Ub|p?>D2P zX!HH`!%gnx<`?hbWY-@LFCLB`etdWh|NCf+7#)_(sh5EIUdzBn1^N2&vr&*$&(FxS zQTOH9@`tAtc8{PUgiC_&?kceQWm*IjXNxwMI6o5KRJW<>go4<1ZHEGD7z%!R+=+ez zVxC>)o#@43hmmd#V8epOMJ0?HYbmFPL8Dj(O1qUt0kuyi-D!L-6zT|nNAUZc)XMJp zA<>FbRw$Cc<7J!<=;F#OM0!T9Fjp~QdiPL8JBlvTm@VB}ttn!3DFva+3rngD=Mzs+ zT`Ep4>6staM?;w5V9HApL~wD6BtAqxoua8Y6@ax6q(;tmL4z9)&9#ZqNf2bSRu~u| zX9W`u(|1ghTeCPeEQtBC>n-+2kC+`6lR^)*sPX6#nd7W@$R8`PKHhZRbpErm+WEcn zr_OrkUT3ZIzVos3q4Tiw=gwa`-*=jwsI&5R{lhx^ua3A05tg}M?+^|`r%vXq7`&Tf zciTqP8|FE3VL%LwiLTopti{`E^y45Ny)$Zl9eliT(v|rX5zG|aTWuVB;`_jtK~og& zA!KokM)=XAuvCOiP?ZrP_bgx?6hpC&gBR5?a zf#3c?>&ai9ytZfspHGr;RR4W70+uKG@$l!PXVH_RA74Fx{v>*J@H6^Y{&e&+aJv6! zFxsWPivJ}tXN+%oeTcUKH8b&OhFDtDxdS6cw?sW;HW#*`+4x7ZvALlM51&1rlWdIm zbEdT?V#V$3xs|Fdr%>|tev3(rM<}^)lK7nozJFGBnF-G&Efo0YbA6iosEbjqj66qr%(@PWee>a!o?Le zO6P=H+mw6eO7Nn&sw^Mzf2-DfF3>u5S<_LjXdF(8q0@$Og0~-8w~kc0`YO2OZ4!NR z;|Z`{Xo&JIuMrK*r~PhzF@f9ZK5TG)>h^~HyhCEW7X;OZ8oU6LgmJsr9X*?5v-1nI zYH`eZ>y6cV)H+8O3^MB_D$*dRWEOMQO0Z(Bb#zmL(#b(dM)Ng8HNj=&wZ(~h)9S{p ze;l;_FX17P-;(gfCcp2ZL91QRs4gk2rmVja+-vdHYHpnfX_=?zqlj(yJRS=(yF3)P zAKxlVQjij?8MA+1cu;Q?-gq33tOZytnqPOhhmWSVc4)baMZWi5eB9@>=HzCD!j%ND z)+K3_XyiZ+YXa`e_B8SMF3n=Nuk|-yw7M_}FcmNl8=G&Da5fx03~z#T#Kqz+<2Pn! z%Qg#avciU#-;hU-){w49Jg|fve3|+P(_N1qVf`D-q!5Wh)kHIAkA2o5LlMaTSud4g zJb6cC$utIgcnhXQTDlzT0*Nt5@;(th3YTog2|q97Ywpa|NG;3pHa2mY!y$s`&{}5= zpyeeSX)tgWE{5VV2-CqbXdri#_T7FbuyO2)VF8~$k&w@IW^~+3e!<(ql|mlFIvBN> zLO@l|!cViz+a@k=S?a{b=1KYwk%Qdc^1+>c>_7xfV4`W>?_of~iR^0$Igo6?YTT0;TV?kw7d&*Lw4|v!}lP1 zW9U_+Tifw<@%C$db9th&c(>Z5;{pZp0YVpyZ$CMmo%;*d?(75^FmszGIDOW()U5~6 zbuDyWdB2?l&{R9QX`vn02N)Z!9R>7zUYfHcM!93|weBLzr_g!)Q}+ZVVZ}%}fQFQl zFmEYHDJ;oNle}K^xsc@jG@p}Rgnh-PSoO=oW{?Q+7R?Bzmu4)OabzwL^o(>Tb^cX1 zU-9jlp{R9!QD(+KZ7dg5Ue~8d?KTYQ0obW2$GH>-PFa!}cY1MZyQ$TW>=&E~^%%y}K)(rlel zrD)b1KGizqSNfnUYYjQ;bJUNvy^^>YO*oc<$G{g=kA62Q6^BP+S>)P2;e<=vI+4uA zbp4Xpw?_9g5(Fr*OT?K$ZP`?VvTBS50i0r}zm^)xh!4tXLLsuPnGA|687Qeu+Q%+= zfBUZchTqVEli+k`V)uexPb@fK1$e>Xj5e<8^v6TCzP=v)7Ee&rw8!`AiTX0q{)WM@ z1yf{k=oxO?e!IMku&|$INToesa)t4yL6domm}C&T%&8A5U`l1?i`SV^TJ(BA7kWLE z=&XPB75sZHKU(r|{?%9b=X%gHTqIS6UJJhT+en=NLqNR0i?Z)lkHtbR@HV}$0v99J zE=jJHh3%hWtNN$c_$TMX5}u}$S)O|hligj&E*>T8A9~{t!%HuN>uh2(Oom>f*(jWB z&D;{%+lpl8qfCIFQ82Fe)GK89%*2SCsGk+=EacW|c6WhRk#@rCrm6q`DBiQHF)6R& zlIx_ql2<&+!b@eY5a~+Sx_Gm&D9NvtHz^PwF3*UFig%t{ma6v2xaM02FMmFEE<**k zUSG4O7nkQ8!NZO|dG(_=CYxx`RLbc=7Jqq3tPz?WVN&>H|6*TjDAS6Cr;F5m*8@iT z`N+f@WI(53k|UN6p`ud1Te2#9D0Rg?lJ#%eaL;*@Ej_mviN8V@<= z0nZhtkZl<-urLi4LmvWV<48N1k%`_QBO3w5>%C)FFeWrSd2As#&>$xwWhS$gNPqHn zb*x$K97qa{V*7J4b(EI8?)2DFtKd=y4p$+xub?Fo%}jO^#m5w=_jgG$mMb$M-H3TH z#y*jJaut}3k@d;D$RX(U*uJE=pIjY~T()Q&;ixmQf)UA1|IXjZhd_`7T(WKMR2JmD z%PZK3ijbN|BrO7>g}bt@!hkwC07@LexZk%ZDb8@zR?yRxWtptlD7JM);f^8=n*_B< z<16zRfrOKrzj0d+dJGFXy3yHdxsup+>8#4uM7?HrIk&+WJgkKGu(+8RIoKI)lUCN` zeE=(XL}FhnAP;U^15adn%431AY+spoTxrQo1vq=g>uim^U%0T~4fTj;9y&u_Bu2MX zE_0N%bZJpWZ}E+?aHiL)=~?sIPHP6%J9~OwPf4wFo@t;{Ay0ouRzdWvkAA)_0xw!CJ7mN^?5{a=?c!y`HZ8wpxwB!41y#4yp28l zt+%nRoy+IQ*z5V`@0fUVvwp(k&a0k=5)B#CGrYDhpW5(|QAR%|FFBf5|kr(QUK$5xMiAAt zk8Ya@`ZS=`)_PXp!RoVjznV73|sJ9Y)b(3a=|ag1c{ zyv4MDyYDe$H?sUDyX%fJliM-7g!WWWleFCO)mt3m?g^ja$3yB`rj0i9TCGYIOipKb zxiM;IE3%-%&FSL@sx8S|9Q`03skf<7ITF=%XD(B|xI*WesC=c1L#`IY95Y7e@eSY4 zl>2y#mkVKs>_Ru&*i-XiwiBwL~&B&r4` zLj}FY<`mQ#NlZrmO2GD+-=?XP7M8oIm3}zi z#$)qkJa*n+Uz_*W*Y^F{cU$@%9-a5u#Jq>KZr=YrzBB`b&*eETtrcBK{t4D;H>eb` zu|KKJnUq1c7A-Ebfd>BdlhWcZZ!{r=7UoHJg})<=1c7V2-QKeUQm_W~NSAjdA|8y` z!-s{NQNueQg#QK#>Z>H^juyO{ID9(ff`6G$UYOo;@+J?m;$D`5_E+P%Q4mLV^fa?p zoU$UtxF-C+dC4W5yUF1gj9+U=ch2Z3X0A1|yQ_Yomy~VO)wB$7r8VB;`;S->VU0*% z0vMCtJtCwHnor;Z_k3@eRY+bc*Pn&?dYmAN7rXE$XHybT`|CSz-&(`Ps6k@&fP1tt z;D33?Hs15Y$5$m~mzQ&HChbB4g)WWB5dLTKT5PR)=<~zCu+$lJ%OGw&A4QLD&aYC5 z{m`V)4|T+#sYfr49+AjR_#L)&BbO=km@)BEZ^j}F;mwJ9%Wh^Y@_SS|O0R*ooL}L? z_-c0t|7Q7)AxmaQsdre|9N*54X25xYCR>?bAI?6QuP&MQc7Y|l$oeD$L^zvnY)n>^ z7rj0UwhQi2Jm?X^r-v4&%m#~#bO@nW#z+$l?`zsJQ!B*} z#Iw9r90$$V?R7IA3$K4%QTI0diu~%d-~8Sd>SDdXl-bXE@8r^9YiQ%!dT52)ACZ$D zw+k1eneMoj3!BU7vkIdUxO8A;IR`lQx=@(7CmA`eqes>xrTY&?N?={lnebOwUZQAS zza^2eHy7jv#d9JEH)bwJ?}#~z(bqh8!?Gy&R$*RklS7n;!D48j1|!clt8NF?b%|m@ z1}WU4x(lXkl8cuc4|yLWJ`PYax>M8!IiBx@Mxw^R2Z45x!A!GMf+x$dQ$rQo;meoL zUv4<9k*MD4-j7Cpd$kjEEw^br-?kc?1C9EmfmiqI5#J9rTri46CpUt6sd^ej%&4KK zOy;pW=|CcKS!p&3q;OYWIXD>UR2_nAH)3mQce1yK;mXo$Qi&{+oMz`_&B!Q$2qFS} zdlHMkj&l|o7y<%eL%r4M4MiO4iFyl<(u){{WmDjnYP84*%VID{228W_=pL=c*5B7m z7$mqPOgWYaECjq+#ae=K@$|D4&p~q1f$2#DNI_Q*(8Hs^97m~2+6|@g!==j2GTRtsS6uLv6h}WXB-}?dYQ(a z7>)y7=-KnyNh7W~sEabdTH0H47Ps$Y4+SJz)RfdOHjrjxX-{x+j9+3@nPxfDd`hf||TCF7=-7TZwDFDAeGmD_3XA$g)L1$4^C zA-g^KEiK9NIgMD9D+a)(`dFn!?68c>9o|cx*hn@}ddfgzl4-A|mHqoj|8I1p`z9`g zl1mpEL%f+M7L%IuEMgaDrAw~zu@;CyQ&{sV#&BQrLL9go-H@xx;=Ka*=8A5=;CHhL zjSUPTdJqAtxNaNTL@9%$X*D{qQ7A^i(@;U>0%y5zdQ{>L0_*`E8eG7BvnZcw*6g`U zEhCU~jsYO{C*n9`e1 zA2*D8rPJj=T@w|vOiTD&<2fSP9phKI7etSNQS3Oh08S{{xzEpVI>h){z{JdxGga^w zHrc0g3A_Vt&7qj}UoDPs+891{gNN>FbS!Jg(q0jn2%9LlP5o54$iSK{RoE!3%zF8Z z4;=BI?S%jLLH_T9{C~_r{z-@QGH3LHBl=%|LaQKHPwDwbv_h^Kzmh1%y zN=5HYFQjD8C3%Gui@(}<>62A^qu zvvmrJ6QJhSWm}$wDUIq-rG(J7b_S9b-UEvT)1D^4W$+8UK9pXHD%7U%UKm!L+$zL09j4lU11mF65C_gy z4n=hN9f{ocPsUe$F+dpQ(=J*|q}N?CGGN0pWO=$8u|pJa28fb>P$uU$M##~mj4#^l z-vEtEdxf{M)b<1Kx|8HQx#lkhOMTxl%h66x?VtcDoedJLW0ZBp<4E7wT>fd48$bOX zT1OHto!0=iA?fmZX9E=}621(wxbOUQoc_sbnf0k8sFxphGOnHHaWWaYiwgN>@An1X zn!0&>W_oyuz9IYeu{)X#Pm_rud5g_;NCB#Jg}`&fB4-0%oQtI$yZOr$Hddk*caZ-2gFLzj!nY^W#fRV+td5P8V4dvoB2icv%Z8|C)K$A4f2o%$S)in85y zr%vb%*ytPsZR|xkhL0V=Z^$E1>Gat{po#v_5Z_SW4b7{Ss$TeC1~_{NQ zGXN6*5cP-PL($yxM@9!?{_=EU;EY;mY9zFVQ7b*MwZ`zg#%-2Q1A+j$Bp9S zaXa;>Uhyz_R;&jMmRV{9tu<(ZoyuTSOkJ+Ijm^v6%#P8UrM^Yca8ohwKBicpwT4&3wEDwMzGMs4KZ*9;^%yn?Z>s`lY5i&n@!Op+w-x+=>^ZvR3Q$EM zf_r_j6Qb!w!4*l{%v@%m<-&g2_E(nV@a;@k3Vi$$MHtT4wkF67FHw}Rx>Sa;z4g}O zd`#L<4(Pj&hUSVK&GaDRSLh;2r;f!og@z-O#J&0ay5mYB~QAlGc4w6dZn^+ZB4c_GDt9Ujpc zO~PLETqXzjm4Z+3%K9crr#c;AA=;7h5AYs;wm0nyIYL)T{4KYWLc@08yC<3S`+{kl z6n=I*K1K-=-;S52SOljtV>ie3;tZots909zsIdHeY@3xZp63cO*fhw8DDOh0>Fm@F zuniDw-3eC;t_5X?O3$@mWhLxb;O?mvbt_nr`-Q%!vrj?Yw9{8+>R^3Q8m-mn#UwF8 zYp+kPzCv+aQ$!J5VY6&mkX*G}O^uQ)JdswGv@#1Ez^qOxXg;ftIJa$@Oz7K+DlwJF zIVa(Y!vXvIpJi^dk+D{nedWmhgz0Mg721z&{DEhVi0@Pc zq?Vz9qWIS3ztzq5te~857j}^ne7411pt!QY3)R^!Q!FA3o#ty&0!4{L)O{0`%3TQw z4IH9cO)I_m=1~n5PD@UiH?!7N>m(s}Bs`>RR@)-8+5*K#UDI6Rs|=a=cf+h#U zwAbv%)#$MR{^7aR)=5~NCYKz(7E`UyE@(>xm>auR-Shc3@=IvrRsP{bQXI)1yyZ`KO8v;bZmZ91(07Iq6O z;qyfRnij*T6t7z4LxFnca^?bl!(F!!`|EY?R^2q6gh>+#w8_aEiqPocPuQ82vagpc z{8~%Do>%;WTiUgU%2H6eI0jSnLPcDDfr~^jHq$af7@NA(R962mRE?_%VnJ}Akqf(X zHMm=k+zG;6)cy zEYSue{gyR<5P%eAG3D5-h|EE2EvU@&yXLe>pma$NXf=E8Tkgi3b&RsU7R<z?tdP zIU>MtMh$CCQEe%{H&aq43~C;=FevEW`UX549lzRJCkxBglV{KO)=e>awjox%g4~Yr z$%)3Ii3zY9XR`qfA8ITnY=fB$p*FObe4^cWf(*`E`e%I)X`Duhn_hI!d%aC#3biuI zHqpi@out>u7}+07DtQ{WqTxkMrixj>=y@xP`2Wq{TTd`p2$GsPTp;%xeYCK<^Ep6) zQ#;M6?jE{j(M94nY?^sCfnALT_;R%_Z!(iYvee7d#_QA3d-~n#I@G7Q z-WHBRKfIpfea^S4eni(e)1kewSCV1nT(u^bGU z;qxrWDqt}Z$-0c~Xs;E7@Qhm8s zMbXx_gYwAFs>CAo=A;zGDxC18Cc2)RYRNm+%YVup>k}pH;Y(5J_T!1RQLOD>eaa$j zy6r7kdPYdcn>vBh4%I7gduth6+9Xo%5ezwFZ88U0Hg3yc&V+^NXU4Y^k&<1zZXg2c z`N(dfgms^i=a4Yt3QM;kCwsyhl5Iat;8tlQ1$$K{1}P05Y9sdTx|(F8b9C@DSmS77 zj7@+ta9vX6kJIxM_9&dd={23L2S=~l6$9lnYOc9`wIEAGa4lqsbQzN=eh^vGBxgJQ zLI%%-zq(3+QC|e2UOLjv4k2iD+#?LCUJ0pA5wuAHS_D)NzR7kEGtg5@)afaeF@~1aW?tFWdBJp(k>fd*X@Lj?g%Jp`G zp)NUciM63IhCX7Kz(xst^LDcjGRZmD!1HdVo&OA@PS4(>R<_)bunGaYPV0hkE5pu! zg@4$zlSG`JZKncBFEB*vh>gd5^G=&&j(w+_Xug5xTv7Ov7M^pZ-?iHr6y4gMXc==N z2R_;}tSA^0nf5Ma>}iYuZ)p&xD7^E`J#XQG@Hq`W7n*vijiN7~b!^@~(Xz9oe)Wx> zWO{CE)_FTumW76$3miJU5%X+g3tcD}ce)O~RrX`n5V7#uY_yVrr-uMB-@@}#R`jwq zp4#OB;C>+U8n$hAHr^%si_Ju%&fnOHY1# z3(9;4+Po}vHrAd+zo`<5cDB%`TYLsq?yXEdm))~>ThQu;?6G-JiDC0b>J8kUqhE0m z6xdC82?Y##FIF>z7CU!kiBoEo^&hH>L>Y#OWh(ISd@Ru-o8wU@WHjtsSSIEy_L*O; zSpG=O3taR}{k%LYN4&~tC4Ap0Mx^@pZKwLS+Z)#9Fok=H(+U@2^`v_Fif~~B=3F=14aFNLv z;!m-qQrNcUP_5Y@55As*W5jU6lXWlcpY6A_j7&3)5dOAc`xli8c!DAyA{j z@^3${2VH+rG%o6#bh!PU`s+^Py`S}Cryh0SLTkFyY37@Io6+Vu?D>--%v-r|HsY82*QZ8dRPGJ*RlB+*v%8ZWCM3K??dL+G-KQ48upFVv5|u#K@)?WP~%J z0zfC>>EE4HvGc{v@4Uu%EQnQstmO?}s?TZJIR-VTBFoMv@vvP8kQM;$b9C=k@lINI z3)07iYrxS#3S6K48E{ezY{%gDV<-{WD-NlGhZ_FS;4YHbKs!yk1~3bm+u5~|ohhKRvM>d- zPQ8`6T3EQlc=C?zzx5UZC)2&OowU)|3ZuB1IUs?V6Xt6wJiOT>{k69BS?OXmyk6(c zYsDH5Of{|>w_LY#wo|HtlZD|m#5kzo8u5x+YNdE()e9;&zsJRjy`QQ$D=f6YnCThe z!3>U)E8VNTo38gh$gL2#Dg&MFk1_)PBqU~urlWX8X#F!AiTzB{FUN`zkiIE7GH8o< zA+(mwMy-N8Y?nccSHP{8Dn{dX@+MPq4rx%WN2Y)Kbp&k`*wz(+9N~RnF757(+*vFQ zNvRM?i#cSpZaa$)(R3Pw_YpfMA! z8^ws^9~L9hA3ci9%zcTBAVSB~9?p@Q$$l|Jlr}6{s?tWKv>_^Q=5vD*(awiPZ%}=# zSgKBlr->#1cw>+o_40ve7A zVwo==AHH~U^yBfDbhNm8y81wJL`*UY+%Oxu;1SBgkdM|zx#1VZprIrpnln;`6Wbiu zIM%rIP~Oh=a%{wyPTo;sqPD}%Ng8s z0>D;q{A9O~@Cy8b7zal$=6!Nk=K{n`AV+1JOoeFN6ydH*i`-WFNSSt};ZFAuE9dq; zRAxcIpxjr{WN^S1IK1}wNMqZ;s8K%WqOv z2S@EZi`ucx!RVNnqk!#9LS0RRI|K!i(gAcbX}rfV_}F-F>-$(Q>P$JpBaDpEfI8Pu zlaF=)M$dE5DR?)Mt(pbXuv?Twz>NJF?NmWG=wDkW6%azgTUE-Sp=9y|cu5iNhDYTN z`}y`e`u2OefQq+ZWk(e(KknQBhh~c@e=LCPd9FKn$2CLj*|2y+O6u(fn=rd-_AVLN ziv#uqgPaao?%8mQgjJ3Qt`_CM5BD>2wKf+6x_Rdj8mMr%5WEGbSiZpHFWH&^r|)>U z*8?oRgEPUbyuI%6J}H^>;MWh1Pl5gK6R_JNoq{ewFEbvD;Mn48eqln+Gw52$Hb>+g zD~@rF^NKk@A%g>sxo2yj+_nWwn^^NVz$+`my6|T9tx*O8mG#-ubo?>m6Y{TOKrHsL zQG6Mv19bCII4et1sK(frM3$*~32euD*->U`5oLrG$_3Wj3POdHloM{ctuBF!Ek#rA zKveETRmu=!^XSSyfv~v9V+HK90ytD;a9C(1+8=tub*&5{mc_LOz|1^xd~LnE*@|Ax zmZ7HsMx*R*c{jouxER+%Tts~_Tk=HN5*;nMkA?a2BDb{6sp5B7r>9&t-g$0UwtKq$ zD^62w`#*E|tMBG6AN=H2e6YQHQ|uUC&t*0qm;V!3{x6HXyv`72^>}5EK2~+{rS0Ns z^b~`c>2@` zkx7RQ%%ZDLJJ7BN$~t2295M-r$MI=8NT)X@zzs>xlnaPw(+pjI*@i-()hM(~s9;nM zQ5rHhu+}f_DEe_Wg?f7=Jcg3`k{~^km}}@Q6e?0811P7Eow;GGHzdvu7SU&4adcUX z$?p)$43+3ufM@`$X)?-5_oB;&>q#9{7#x~B0(SK@8Kg7DIJ|x&B8PRy)}ajovSnY?mpuqV z7mX#(voFdd?Z5A#Qw2|6An8QL4Iv_0<*O_|2WfJx!m31#Rf0VgzFITUqMbBf$(;mY zW9uS9f7#Q3<-HoeF)Qi^coiav*|22wo8o@w00#7t zm$UbkVp;jf^s#s_`O=OGQAbhEAudR_Q3yp#sf0A``$}1Qm7JY)_a80Av_@<^r8MOM zdtmum%p#L7xhiaVZ8BM&i_RS}@h7I0ZZ%H4I#=K0o=>I2$us`vrCARhO7z{876n-1 zg^pSh_>kALxNG^eX`WJ4&vp%<89Tv>iya5HGtbCJE*+7vqg?b%G#(q-53Mq7b|Yd^ zlQpNyoVOSmkcZ`VWlV=-(cG_uO=4UzhO2X!!)f?}&D$8!7{nC5GHT;IIcrhUdOO1! zEyDwv@pTW*pg2wN&tnTMU77-5zn8+-qkhH zHIzP)aIkzYXtVNIm95JPg4u>El1vu<{h>MR<3q+V;g)e9)O++En1k95>ts0mfrU8It?3)d+@cV`YyySW8$-ENUC)%Idf-fGeC3aPFdj= zM+6hWu={Oy{E8!I5NO>+Vw?g)9~_GoE{ln2p)lvI>ul;&Z;kv{LXGe~;}yaJd$TTp zb`-0W89Tu-97Nwl`!n)-z?;_IkBGR|R*DNI7TWAd-8*oBX>4vbRR|BgBq{uorh%lYAS8zencrVXb2rxo`Mcmlk$A5cv@bu`B1|;WF(Eiw< z&WX@_tzC+>TXlO_Bq<89&~W$B*yju}O1?vK3Tm?l)2^I`$i3tgt<>Wl<$6YI;5%WL`?@mq19N zQQV*tO`%`khiu*KfEDmfZm&$SExCv%{T}K!3)&^JvA4;y$tLqUPP;vNpITItPcvY< zz35?{;NjE74n+f&#gYc`eYPt%bU`qBWhMmec6*T!Gejf{VOqR>`KLcg7v4Ld0)<%a zyfgjn?H{xs{hOm>-Dg&gD|}$Q&*hwV&EoP66>epxU}rypsVG`2gzXh1z!Y(p#Sd$d zEok2>)i-GX8~A%&KAYa_tvOaYID-gBO*oL~hq3=4|Ho$ei@yE(MC9F8SH^OXc{t zocW#dH~oe(Y-UgM{&y*UiP{G?blCF58lKp**~v5yP76)@st5|vf-*Uv{i!rTRwvoR z2TzBhnGI{wY@8?dG5bw?%s847QE$>kof>CRD}XA+stOUo&qV_5^muoBpSdY|x!H@S zIcBU-+V!uqY>-8lVH0cbY!*Z;v=M}S5s~@slSZw){TqnI5*{OuAUP$mqAGw=Vb~c}6T2oPp z@&rx=dPNJH*c5$Z%67UwH?5~^7cpMC70lni51xM?Je3DeEhtJ6JBKbJqIESm83rw^ z`wQzVJx9hY6KwB1L&C}*^JE(JXTxDpfy7_Y>VxEG^~R30G`~pCrVsg#5ht>YjUY`r z2709-9|X3<)C|r*xQKL7TQ1p@(tlskk zy&cdta&~r>Uhmgi4N8l~`5|6Z!C|;N9k0!u0AV!!*6FI3cv|AlW4zU|bYJ5?Bn+_U zEglYxr0XM_WEnyxawWP5GFPhF;6!-Swl+X;)o!nMHmxl)-`4lhjw2n8TQ)B>$mBKB z*M}&T?GFYhmOW|57N4+mNMkCqX?A%SN&G*XX0>6&(MD)ijL{ofc?=m63Ezv$ zPYHp0h1L+Hzy$<dIu87%p9q8_VN3B9GEgin{@w^AMBk481u)Hh*i#;Gk;^O| za873i`(bFH1rvhwOGBAqPw9NO5uQsu{~HgrjP%gEZ0m?v!!G0q##uU=iVZrM8NlB6 zJO)uOQ-D7*ay@djvh!F7PCNhXsZ}#aBrdgfs>U#bd1sd#$9;6W6@kOPeP@9<;n%)7 zfVzC8Q1081ZDqW0uVy1d!PDU|>8H3@Ke+I}Yh~PGQv!2c{zYL0+fXmc^oyZ>Bs^T+ z%XZs4mtU_(Yo;f4iI8ag|4i68NF^RytJE5vX1+-<^J<`qQFcvEn9gm%=ACZPJprkp zdcY{dj4ML4jCpi~jY3>T-L{*ve6o3(jyB2qzV!qSvVK3>`AcNYHGya!{`~UrMN~hX zjrxdd;n;E(9PJEqt<3udb;xD3wPzb*eB(3p);q4!Agx%ZxySgwsTBvT7senfA-Cm% zOMr2GtOpBwC8}<|;le6Eg|s)M_n7k+dFXBMcQ;*lBfVJ&NmTak1*UZw(p_OHk1sUuam`J*Aqf3#UAHHBPIAZOg)zm%O6N48!_KI&r&-(a{U`eC z1QPDLDnSc+B$o@NKT#ycCuUihCN|^=gS8gQwO15pc&$q^Eyzz;3B?in=PU(+kaJS{ zm#eafLz9M(4uYEbY(&>9oDSI1NxIab8$Aw z_Pp!ro?pgZ=?6O^s{il*~C zy^FH>hnSzYDy?o3U-|!AqE=zbxH=1TBRZcYd5$avFr;UAT}*9wkU5Lz6Zw=SM%pJj zC04~}RPMm0RMME>Ix3yCcRQy7#!BXJsPIJ$of6?h@j9BFMFp~nrs_rNCxL5O4dd`t8o3(&pPl~@pa#}DM<&qg+o&(9GQLWhIGBal zGoeG*smomfVPi(}|1-W8WpAGfGdR8c-qHllWLseVR;pFje#G~Z<*O~`3)Wj)6O}q@ zcX2!m-1PmqxfL=4l0_s=Q-)t)kw{T9Xl%A36Cu@T$Ta?`D$-OoAifmo)CQ;dKgbk} zC+P@F5;+PPljE*&<#LFk<(o@Id8Vb9=&FKUP2wD@BX_lzzHM&1q^S+!P>@|Ucg7PG zp`t&4N8x}`{F9(4K06S_XM>?=*NaDisEMQMn;_PTZH;p(cgoXEOW#WBOas(gk;Fv# z6#o@1MF{o5tWOn-(Lf6<#Z@+WhqVqeTy?ovKcn3+EyJ;aDi4)RLrv?8EZ8xxxFgzKd-z-lCzeh0bw5A*H9CdU4d$N_xZ~&yC8m>v z*Ud1#i4csxT`#jRMe-^~O~E{OrA&MGxvA!xX0#%6BUuS#E=ySWuY1;1`qSRsi?$-? zvKH&C%TTK%$1;cX8AN%QVr=@P_4`VDZ_jkz*GLz^d&`zyAv2Jo3t&_|z2S6D4-K6v z7F|P3HW{@G%l&C=HA1&jtFm2XG8u#M#60 z1NOKySOcZiFv==116_YKa*3)m>t2o8?KaUV3K>*hJa@A7zng*i{~LzowWS<3{7rly zOr>MOl_P`WJ028GHJ67K2>M=#_k{}OOWl`9d@D-;+ZC`s%`6%i70rbgPy_op*X35h z#)an0ce!OLf>mybh(W%vv#sxH8}PL)C|f?Kr>*N}>w8=p*@mbBUELfsP!M)3T+1l4 z%i7V_I_;ME6t(4|BqkqRr!i8eH@J1xlR*Jk#(sq|R+Rp{ zCJ9taZYWpivRrgFvfN6(Avutj9fcf|n8C4=$~|#Vhl11Vd|zgkN9LaH+HHH|OBQFt zu@mseCXF22Vme1@sE~fjO9NnBFet*Y-fT#QlKNi@DyA!9;;x$OAkbJQtb9{MGn#mS zp$Kl+RzN{?g)<2`pjnkGg_tSwC($jO*%}_l;vhl03$1Qxf-E0?-+IE?OC-ZmZw^AR z%z8Y)#Y89(d_@Z`N>|822aql~b0p3^BI^0Z@153QW21gz@UC^i1O~@hGTxGaECjKy zmA3mgp19t%u(S)LB9}={X!-uSF>5j~55`5JV&sb{$|?_CV#<32*cSX$wmbGb2q}qm zd%as#-Wm?qBhis?y+!kwWOMIw*&XI~oJ*Ow)S>N}wT$ze@k|hsn%U_EPBO$nRtHZh zc<4Kh)xiKNK>g1!$`%L9byj?#g>IM?<+bK{c!pv^1u!^$2%JEIB1o9^%`5Jrr9AXX zF{PBvuMEdgaOtf#!env|7;%|EmZ)P8o>*5}C=^x^Q?2Nq`9+0;=4CvA`LffbLJxjl zkfBEb**J+DV89>)4H#yODtK|`^quf-8KuX36BL*s$ls*T&=@{-?bJIBOv)zWFaVX8 zGREWK>|v2OB%)b^v1iG zWEs$M5~jz!UW%AO?D^#ta5~A}B_pxBUNwF2ZieoC5b-PG^I`0_*l=kKAq=B-6P+bj zB%>SPr_@}l#$?9bOZJxVK(B0zS%oCpl{04(n;U0v$QeW+&jED{aRN_?#j)8mD&K}cB?G0% zVb<`7muoSH{}|2&({wy=a%Mete&~^Z66C6IMrpa`>2pviguSu( zmGeHWh{8yKBv?rTcQqol-dGP{v%mn4Zycp2@uP#Q_$KF_$Kq<9i%IM*k7Pv1O0@T` z3=9j(p(o-XCg82Z1e$|5UW53?W+&nHY@{A;2JLq`Nqg^d!{#{yVDqwYz4hB*qg4c6 zkvp4?m03T~1)HDflFD&-am0gmkufQVVdhA1mfEDeGgllY-jxg$qlYR-x3K6kmp9L) zOV6o!vNJ7z34n~^kS!zb^2MKX#8%P#E-jn8*mXL+@W4X13C-3KHb@qS4fSmpB4Ey9 zx&tTUJ)tM6nTq%T4#~JR?>$(@6xiklhgg=B#@)4(VI4rykl;*iAJy@Rs)M@P5Va|X zD*_geZVxWZnQuVjiZp{GoidN%xRHd}Vw0s-;HnAwW+^KeDL8l525JJo%I#?*qtQj$@P+Lzz01f#7S)q@_#^tbVX!p# zb6A7S-*|^3abVvwr5oAl-{~d%A&qVU)fkAQ4fR_Fol()0#*lVyP+|pwc3;s6ync4@ z^sqgMo7z|=MBEtmN_OIPBZV#?2-=j(q6o5sAPdMaXe0UbQcOwmn8Pzq1@7wd>-$cd z$hyqCgbY+%eNiw@u^TcFMcUkrCNRrT(rI#zRyxRicTRi&K`jg|5*DKSI!z-`3_ShV zQnRGgvMQ}Qu?d`v78m!5tbG(zFc3I&@jRRuHe>GCTXjd(=5**UM6!TiCx<;zqJv$(%(%Jktosr=}6GbhN6Z3loZm_qd4^rJ-sKcrhECHhl_e zhtsZlp-62ewJZ$Q0Xc=V$P*`aS*9{o{)B@)!h9uCTM7kUL315E20C?1?OLrzt@CNL zvqY1Ov!}Ta8+L$+cqx=xD956i?$}K4}Q;XVC#ZE1% z*0Eqi0sf14B9O3Z42qqb4B3N0)6nY6SV6O>Z>{g`VjJELqY9;^wLWjSd+f|s? zXc&(W*JlDRrX-`uij#2H;}?5Q12vgia|0a!o==hJh(`S!m(Qw(_+eE5ZX_5cG4iGD zqv2h|TyctqO;gTkY=ChG_9^fhFpY6^ib&rm1jFJc$p!8l3>~XT=`^HWZWCRJVI|XT zm|t}nO+|5M^kq7tm%HxENphKD2jTsFHds>VEflyiGBIsV7Q9_$(L2HdZndD*S60-eGOzVo53&evu>3Nuu9W3io0lH@e+w_>1=AM^(togc_Cz0j<> z*P_ab+-6Yww!A8FSU&(akx#Sn?E3aSk6O|8?R)QjwPEN~;4{iNcCP6tFL>3qUa44cie31 z&)4&phkrdfK6?HPo2|wFx9mGoqR-dugP#wvu~6uLv(7qpU*`!k%ynIpbC2gjkIu!g2wPZpjQ%$ew!QL zu7XsHA_r5AA=TRWson4noYm+tbs++VUj4ZS*pDrRK|`JT7zaH^2v@8aNp`nzGHCr@ z$su5evEK4{rmhY`!z(9h$wS5WLbGY`-9vKC4oSUjR&!w(%m=5mho$1+n7v(TP8oQJ z0-^Aa(K*<6JYI8olgKH}4yy=`_RTj}tHzGJ6-}k=P>M^_ zZ1>!#Sz}>san@m#<3?a(nJgRcoAU4tuyE+TBx)7-30W&m2!Me3)7o z4k}lYkS&GfMV9FxRk3G3`?lzC-)4&@x(E<**ha)zSw1KlT)ZH_O}g23b|)vR*p1~C zO$_MT=iA*>DDbnlF4Ea4UgJHL`mw!LTn{8!w~)PR zu7vWyY&I#9`*!6%gDNDgRzeeIdHlN&G*gUwhgpq&1@h8tHKR!^z|(MOH`~pPC{Iyp z;90MV4tmuQ>cIa$etsN%+ur57E(0sK7m&B&va;Bo(#9(0X*Ob4b%Wj~hXT<>`Ezil^})1U`h`i3#%q8e)vouGmZlhM8fPX*k@fShFuG8F-F706+XCCgW0 zRI{5vNwG$#Z5M*tu%OC@$_k5&l#5w-zg<(iF2==!litQgt#82!q`fN8g#>ompOI&& zg#55(VJtmV!<|Wj(x7xo8+njS6SZ7(c`19rQ-cg=OKi2bf_K1z!bEyj1|)YGIM?se z-6~p#0cAJgwY&*qVZY$-$`^|7%|cJazq`y*0t0jyX?*22&qorU*LXX7ekYvKsfXiF z3-Y0gS;=jhWU{jn2QyaG)!Ylc1;jYJ>Y6kq@p5I#E_y#>@(S>WIikx_i^PHp%4d5! zwy-Z+$-9BN=J?%)eRkadY{2DaWL$|g2FE9gLcJwq`{D>J(2Z2!cAC|OCj?8qbG|0@ zscB-YBLVnWp2(ybsRiaI&u5(9)5HMy_Ss01#rwESUmQJhV)=5RXmz)b;ki-PXkMtA zt{{S6M-Kxsdtqx>FOwd)OlZc|PPvV0BRDOLt(9R%ixPfEmHZ*9692CUzP*=^9~jI&8YUlDP){4Kb&?{4WZ z&mZ5XkRi2~*y^iZL%Zhaj`%5BphT*3pu$N!%E`>3J;-E#0U>S6bDIiw%q-k!S)v;y zCHC=)oo7!xZT4oT-K5nCb$x6$Hv3IpK!a>2qb$#!>>R&135@IEAcadVN+^g!P7uSH zY-n8{18Z$ZCURu^=!ALXEm<_@H=Da`Vdn#peUiyj^PV$Yf)J;r{oXLCQIIyX_F21A*ZvnBxr#M&WE;!+ zmzS#Fe^XcW5O^I8#&Hf!cK8;?3v=u=1HmNF*V4w4z+W6s zLVk>|c6anS%gy6yg2>GlK?((!8V873t++Rxkf|CG z=UM+oYvCK!cKglN_Rd>V+e=9mJu*e2!ji?~#|$)ehN^AE@hQQz2&HYA6q2Q0Y|JQ` zp5}eqNoH;ZV;jQ*r>DILt-e|861Oq9$)Mkc>spFFSl3CvT`Utf9TqD66Je-Z2l4E{ zkq&14gsYJ2;Vf6L6nu-WqP^~2lJ{S#* zfY`C$icTpksZr8P^4y|+RV_$1x+Cn5`c0D8=SP=>iGZ{|euYbaxn=rULneA{WW31t^eCiWW~d&XGU(L4Et+&r+g5+6(z$ev5)bUW+6WPRr(y zrjjTWj1~T#;%!2$&ZK0RqRE7!&9tNFh;*j!Fu#758!_>jv$3x7)*!l<;-B;3`0F*1 z5b(Ye&uAgn-gaV`anyFg#vi29=>T2);7$&?eoN$| zx`k5(YQA8Dz$v*%t_i3M>W3*3s5f;qRI7?CKiiG|gn#anI7uf|EIDvq5tIfY_yiyl z#WHBpLye~c7i}i2^FA~kcW}nL))`bCJr#H1zUqoG*_tx|9AFhzQJ%A78`-Ujy%+`D zV0bV%5YV=#pPmyaYdRIf4`hVl#tKL04UA#}Oh0>-Q&4IeMXA(9FH>i%RJ!S!Me5eW zeqxU68xz*Y;^@6{f<%Pp#q|la5&3X>`ZusCdjkOCAv;!w4Fe6UTUzc}xr zKmYmg`A;Nkfi*FNM&DbD-lK`pY%)Tr_Q#rhcgv#RPhLHG6tyz*(k<1UD@y{uuLG0) zN3`W3|3F*2d}-Q0foD_7i3P?<9WV+H3x~rgiMTh7_M&EMz%Uri69*|5cyfltgw=rt zQ8y~>N1S)2HAv4fc7`=Li@g6F=^vR8;|;#;o z9HT<;NGsM`tn9yJU@RO*B?q?2bF#NSNPILY7D6FjK;*~>Djl3wZWB(-c++=>@e~$! z9?WB5M!cMkb)R2Isoed>j)!)_>jKI)E36Jnq~2cl3aX#50>=lQSTuZ2a1fW&-$=9k zfF>c+YT2{Arzh6^GVb+~F+;?-*4AmeUM}o&p?!XSxX(M`eIB7rVhRM;MgGJh0|lNY z>@prl?lBPc(>{6Mqr1K0wdx3?X%#{f=LoTlbR|$M0jJ5#cwk*b%HydyJEHSss?eJP z&glbhD*TI;w8@g0yRv-goN>T3N`%$u5OqiDy4_b!hw;B<6kwX3Bp9MkKu+^`a4FhL zxrRh}3fB%)EbWnhHy>tsg6HAXBHSYFB~vvY$@YH~NyfJhMfOjzmHCHQO2B51Q{oSi z(fZz{>E+{WW$tOV;t7U7={#8KL@1vL%bW_{xe!H_phj~JhFcyDpK>@XIv&CY#OFC8 zmKjYihE({VD8|0}tcS%v@3{D992lPwB05;)ryUy9ZlK7)qKUT;oE-k4fy1!G!C^KT zhZ55@6k0!a?UdKe7jO=kB|&zKyiN!~#7+_^{*LGxM&rm3&h=uUyh_rkt_CRmZ!r3P zAT`C;5Kkmbj@Q?0n3T#hpzAn71|x+eE2oZ)lP1%UV*lrz?l;C1^G9{y1Y-*O*_92NAg%{gjcNL!O;6}L9h3n|HlHA*t1YwcR!T9l zR-zAro*K3O61j?RGk`0uqT7$hC@w}MGa<k5vf-c4^H=d#nWRV!-a*a1{FIR-h!skvKB*`3T(mxyS4gDfY@3OuN; z&^exllPcVB@*oXI`6dw4@6Br%Q;u`u46ga;7&5jlcmj%pFH^a~pRi6^BrTwxlH3ai z-CoD(5nOPQc-pMI-{xTdx~-KwjH$U|KUzJwHrMmz-eBnBjSV1TrE~XP+mD2g`tv~E5iL}}%67zZxy`O(kHi3WJkBjPQ4;uDs5 z<7uLLk?S`NB@nO4l+D3?yG-2&&eg=JjrdEY=!`v#V0$B|8;Bu>9h=}Z%|`upbg$iR zlb0gaN9&fVS@ZCwE6YaV|45=m@m!ipP`N>-rMf7F$YdvE{^J+PFlDjRgf@dn(F+=^ zq`#+B#b?>V!PiiCS71;UUEZ91XUi1~rl0Z8^kPClZi47eFtp0_(R~q*Ss?hMrTIQD z*Z*ABuN(=L`MdctnSb+p|F7_SA$|ja3loY?gcPpD1dkaoD9fIakx1mc<5)+cJy#jlGSsI}s3k!?GfKi)M`rl{tzt8B;bw<<5jbt7FmmSkyEB>dQ z)HDhojCaomG5B#St1FOW(GvBwgVpYXNui+*A&Yec^HbiwdGhk@o8P0i>zkYB40rWe z4m@8SQ$F=v&CIGe+ThBj7Rz;3S9>FsJFEH+HaD9l_GowzoY%e~ZGAi6`2F?9MqL61 zG*S*1P?nUzFjSZ44D6d|h#4y;H7+5ureA=;uFiYUlS;i%$js8=9GOv8=yCcS!X!6d`54UlSa!d z9Xzh2lX)O(7uE31z|=^pVNJlSMODMKBs1n_`wiFbOpyH=_C>823}ZRF$kpii$Qnk% z`WeLR)Z!aSR#`|ow87Z~_HBq5M4M$J%199JfPm(3t$} zMrdSciIl^4dTR!8yg9m}@pgz9(+36bg;<*GDpW4VtQQSp@k3`)+C8=+;V{7aG=3syaG?X5@SLZiD)WKf<8 zwm-BlHE6@&hA>SNiV{FW*BWIl)1-~?PIX8f?R<$EY{;8)L7@@7U9{L+Ect&~WLfcH zULmVxVf~4L;4|?H>&NAslmSnj0|91`)zA{>sh;EIch3j7j3|PLsB_lZ77N%3ism@9 z$cKI7z(P!gZNMv>fY=1kGA^#L8_>s^mXQe=4T}YRx+wm~on24Dj#4Fv&0i#uXPiyp z&+xk`f(L~I6u>ZdCng3^*p;j9gd;6D3ZukMGilfy`rWWO3qEQSKb(*!$S5?CT$f40 zRUrcmW)kbPY*IF_rBk~&4sO)I(iqjPqny1oOQiU?*P9J3Sd+L%NzS&l$E|K*sV&t> zt@-Yp;`qg!5iu5CVy)l4Eu1xJa5E=a6QmWf*&Mxqc{t#;{J{hde{LG!eb@vt}bn3-Z zrilLUECnBz#Li*ekInm=^%N2pa;FfHH(9dj2T!wwxbHN~?`9*p*eHhW7A_#Gw8Ff!_ocI$pG7Ey-O9BL4;QH!5v_Bn-%;q>{ z3*RG!%0RN(rodFX#nNGqRw}&o@tKE*1JLk*)1!t*#MwchC*asdec0p%0-mvAZrBwo z?a9((L3!E}WEWU>iU+?W_CXosfZ(Mki9|2sh+nuUcuCn?MPbAWF+Rd*G#KxzTZ{(c zd$=!-2|~9A#>S9v7=-RaX}PsH?wu3E-VfrY5>>C<>I(s+(_0?FY`~qU&?W)bg$=M@ zY%RXz&tdTG|7=<^iRLm$CNYmoAd4W}?m+-)ae2d^j(ZatBqP;+zs8SZl3hQs2ccnH zA#FWs4HDArU1N*8^vc2vc&{;KYr6=%qWC0Om-7|}Oehw$0?K6Yt?zB3{9TGyby*7g zXR&+OInQc@1_X2{WQt=9W*LjMND_o7Zlo8*n-m7lYL^T<{#n62r~x#PCB4H@Bv`s~GZfkujWOhrw$& zn6HHY@3bjEYM1hnzt4I6!OTF+(7y3J7bVJ$rOCcMIvu4oW?~5Wq{ve>3W`TYYwfeS* z!mWa6D(Ca1!5Sl~zfW2D*|yOhKG(YXoH_MXpNAr4M?Sz}lDToEuH8_LQB-ZGdL7f! zx-LXq)GsIFtNuxSv-I6H6uS0pS+C2MtY7}#Uf=xk%jSv6!Z$kZyOdrlQY)GJYlQ$R z&%OW2pZh>IoqO+7VeXfneJaFAWy;g;8p6gwk%)pehU2m!Am`~ zVbt1%;l0=E^Vs5eVA5;&2`gnSa9mL0P9b$ik_Q+N82Njc2*(~1;VR1U_?JJeS+58a zw`OKwuOPvh1DYsI2APoPpaYGcU^=n|bf5wiDREwT$nA^>^g}(aZgkFoMZZiYSCe#_ z*pk9s#5s&wFk&CXnjJwTq85Ud&qmx@vb17{#rjC(t$~;nzx)^A&zzZ%9vnfF& zHd6H>!j;3mwtZ;mJ%dTRrdghm_Qmu-G7QAjoUU=xY+no^`K8;S*9}R+RtaJ+X>Jr} zvWqrNGA_b;TxboJxR?UnyHdW{x%cMx_S^N&+Gc0F)krthq0-vLS1#XYI3P3^z)xWD zP5K0kj{a=)_Sz={TT84$AUA}wDtA_hmZc89Nw~1R6_-qAR)umMx z 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