mirror of
https://github.com/unrealircd/unrealircd.git
synced 2026-07-06 12:13:13 +02:00
b0dba4bede
and 7 for unknown-users (with max-bytes 5250 and 1500 respectively). This
allows pasting a short snippet of code, config file, text from a site, etc.
With multiline you have the guarantee that:
1) You will see the entire text with no delay between lines
2) You won't see another persons chat half-way through such a paste
3) For multiline supporting clients it is now clear that all the text
belongs to each other, which can make selecting/copying it easier.
This basically means short snippets/pastes like that can be completely on
IRC again. No need for a pastebin for it. Though, you may still need such
a service if you are pasting more lines.
Regarding the implementation in UnrealIRCd:
* Clients without multiline get individual fallback lines (concat lines
merged, blank lines skipped, as per spec). And we know that clients like
weechat - which does support multiline - also shows all lines and not
only a few plus snippet style "[.."]. That is another reason for only
allowing 15 lines by default and not something much more. Otherwise all
those clients would get a big wall of text, which just sucks.
* Spamfilter (also) runs on the full text of all lines together, so
splitting a phrase across lines does not evade spamfilter.
* Fakelag: a client can send the BATCH start+PRIVMSG (or NOTICE)+BATCH end
at full speed. We impose no fake lag there. Also, the multiline default
max-lines and max-bytes are lower than the example class::recvq of 8000,
so should be perfectly safe. If the entire BATCH is accepted then we
will impose fake-lag afterwards, with a cap of 15 seconds maximum.
If the BATCH is rejected, we impose half the fakelag plus 2sec.
* If the time between BATCH start and BATCH end is more than 15 seconds
then the BATCH is rejected (set::multiline::batch-timeout).
* The BATCH is atomic (either you see it all, or you see none of it):
* When the client sends it to server, it is buffered first.
* Only after the batch close the server indicates if it is accepted
or rejected. This has various reasons, two of them are: 1) The client
is going to send everything in one go anyway and not wait for a
response between each PRIVMSG, and 2) we can't do many checks in the
buffering stage and skip those after, that would cause a TOCTOU
problem (eg. a banned user still being able to speak).
* If any line gets rejected due to spamfilter or other case
(eg +c, +b ~text with block, etc etc), the entire batch is rejected
* Locally we deliver all or nothing (as said)
* S2S we buffer the batch as well, so if a server splits after having
received 10 lines out of 15, then clients will not see anything.
* We send max-lines and max-bytes, this is the hard upper limit.
* A multiline can still be limited more tight if:
* +f with 't' or 'm' restricts to fewer lines,
eg +f [5t]:15, which means max 5 lines per 15 seconds,
means the max accepted multiline is 5 for that channel.
* +F works the same, except that default +F normal does not
have a 't' at the moment and 'm' is very high (50) so
practically not limited by default.
* There will be a future +f flood subtype for some more control
TODO: we will send CAP NEW on unknown-users <-> known-users to
indicate the new max-lines value if you transition security groups
TODO: chat history does not yet include multiline batches.
130 lines
4.7 KiB
Makefile
130 lines
4.7 KiB
Makefile
#************************************************************************
|
|
#* IRC - Internet Relay Chat, src/modules/Makefile
|
|
#* Copyright (C) Carsten V. Munk 2001
|
|
#*
|
|
#* This program is free software; you can redistribute it and/or modify
|
|
#* it under the terms of the GNU General Public License as published by
|
|
#* 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$
|
|
#*/
|
|
# major edit from fez - to compile objects individually...
|
|
|
|
CC = "==== DO NOT RUN MAKE FROM THIS DIRECTORY ===="
|
|
|
|
INCLUDES = ../include/channel.h \
|
|
../include/common.h ../include/config.h ../include/dbuf.h \
|
|
../include/dynconf.h ../include/fdlist.h ../include/h.h \
|
|
../include/ircsprintf.h \
|
|
../include/license.h \
|
|
../include/modules.h ../include/modversion.h ../include/msg.h \
|
|
../include/numeric.h ../include/dns.h \
|
|
../include/resource.h ../include/setup.h \
|
|
../include/struct.h ../include/sys.h \
|
|
../include/types.h \
|
|
../include/version.h ../include/whowas.h
|
|
|
|
MODULES= \
|
|
cloak_md5.so cloak_sha256.so cloak_none.so \
|
|
sethost.so chghost.so chgident.so setname.so \
|
|
setident.so sdesc.so svsmode.so swhois.so\
|
|
svsmotd.so svsnline.so who_old.so whox.so mkpasswd.so \
|
|
away.so svsnoop.so svsnick.so svso.so svslogin.so \
|
|
chgname.so kill.so \
|
|
lag.so message.so oper.so pingpong.so \
|
|
quit.so sendumode.so sqline.so sreply.so \
|
|
tsctl.so unsqline.so whois.so \
|
|
tkl.so vhost.so cycle.so svsjoin.so svspart.so \
|
|
svswatch.so svssilence.so sendsno.so svssno.so \
|
|
sajoin.so sapart.so samode.so kick.so topic.so \
|
|
invite.so list.so time.so svskill.so sjoin.so \
|
|
pass.so userhost.so ison.so silence.so knock.so \
|
|
umode2.so squit.so protoctl.so addomotd.so \
|
|
admin.so globops.so locops.so \
|
|
trace.so netinfo.so links.so help.so rules.so \
|
|
close.so map.so eos.so server.so stats.so \
|
|
dccdeny.so whowas.so \
|
|
connect.so dccallow.so userip.so nick.so user.so \
|
|
mode.so watch.so part.so join.so motd.so opermotd.so \
|
|
botmotd.so lusers.so names.so svsnolag.so addmotd.so \
|
|
svslusers.so starttls.so webredir.so cap.so \
|
|
sasl.so md.so certfp.so \
|
|
tls_antidos.so connect-flood.so max-unknown-connections-per-ip.so \
|
|
webirc.so webserver.so websocket_common.so websocket.so \
|
|
blacklist.so jointhrottle.so \
|
|
antirandom.so hideserver.so jumpserver.so \
|
|
ircops.so staff.so nocodes.so \
|
|
charsys.so antimixedutf8.so authprompt.so sinfo.so \
|
|
reputation.so connthrottle.so history_backend_mem.so \
|
|
history_backend_null.so tkldb.so channeldb.so whowasdb.so \
|
|
restrict-commands.so rmtkl.so require-module.so \
|
|
account-notify.so \
|
|
message-tags.so batch.so multiline.so \
|
|
account-tag.so labeled-response.so link-security.so \
|
|
message-ids.so plaintext-policy.so server-time.so sts.so \
|
|
echo-message.so userip-tag.so userhost-tag.so geoip-tag.so \
|
|
bot-tag.so reply-tag.so json-log-tag.so \
|
|
typing-indicator.so channel-context.so \
|
|
ident_lookup.so history.so chathistory.so \
|
|
targetfloodprot.so clienttagdeny.so watch-backend.so \
|
|
monitor.so slog.so tls_cipher.so operinfo.so creationtime.so portinfo.so \
|
|
unreal_server_compat.so \
|
|
extended-monitor.so geoip_csv.so \
|
|
geoip_base.so extjwt.so tline.so \
|
|
standard-replies.so issued-by-tag.so \
|
|
real-quit-reason.so \
|
|
spamreport.so crule.so \
|
|
central-api.so central-blocklist.so \
|
|
no-implicit-names.so maxperip.so utf8functions.so utf8only.so \
|
|
isupport.so extended-isupport.so \
|
|
$(GEOIP_CLASSIC_OBJECTS) \
|
|
geoip_mmdb.so
|
|
|
|
MODULEFLAGS=@MODULEFLAGS@
|
|
RM=@RM@
|
|
|
|
.SUFFIXES:
|
|
.SUFFIXES: .c .h .so
|
|
|
|
all: build
|
|
|
|
build: $(MODULES)
|
|
cd chanmodes; $(MAKE) all
|
|
cd usermodes; $(MAKE) all
|
|
cd extbans; $(MAKE) all
|
|
cd rpc; $(MAKE) all
|
|
cd third; $(MAKE) all
|
|
|
|
clean:
|
|
$(RM) -f *.o *.so *~ core
|
|
cd chanmodes; $(MAKE) clean
|
|
cd usermodes; $(MAKE) clean
|
|
cd extbans; $(MAKE) clean
|
|
cd rpc; $(MAKE) clean
|
|
cd third; $(MAKE) clean
|
|
|
|
# Generic *.so rule:
|
|
%.so: %.c $(INCLUDES)
|
|
$(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \
|
|
-o $@ $<
|
|
|
|
# geoip_classic requires extra library
|
|
geoip_classic.so: geoip_classic.c $(INCLUDES)
|
|
$(CC) $(CFLAGS) $(MODULEFLAGS) $(GEOIP_CLASSIC_CFLAGS) -DDYNAMIC_LINKING \
|
|
-o geoip_classic.so geoip_classic.c @LDFLAGS_PRIVATELIBS@ $(GEOIP_CLASSIC_LIBS)
|
|
|
|
# geoip_mmdb uses shipped mmdb.c
|
|
geoip_mmdb.so: geoip_mmdb.c $(INCLUDES)
|
|
$(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \
|
|
-o geoip_mmdb.so geoip_mmdb.c mmdb.c
|