Allow kick_on_split_riding to protect channels with mlocked keys.

Do kick_on_split_riding if services sends an SJOIN
with a lower TS and a different key. This relies on
services restoring TS (changets option in atheme) and
services not immediately parting after receiving the
KICK, which is the case in recent atheme.

For invite-only channels, still only do
kick_on_split_riding in netbursts. Services is
assumed to handle this itself (atheme does).
This commit is contained in:
Jilles Tjoelker 2011-04-06 19:05:08 +02:00
parent 572488e029
commit a1574df4a2

View file

@ -639,12 +639,15 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
{ {
/* If configured, kick people trying to join +i/+k /* If configured, kick people trying to join +i/+k
* channels by recreating them on split servers. * channels by recreating them on split servers.
* Don't kick if the source has sent EOB (services * If the source has sent EOB, assume this is some
* deopping everyone by TS-1 SJOIN). * sort of hack by services. If cmode +i is set,
* services can send kicks if needed; if the key
* differs, services cannot kick in a race-free
* manner so do so here.
* -- jilles */ * -- jilles */
if (ConfigChannel.kick_on_split_riding && if (ConfigChannel.kick_on_split_riding &&
!HasSentEob(source_p) && ((!HasSentEob(source_p) &&
((mode.mode & MODE_INVITEONLY) || mode.mode & MODE_INVITEONLY) ||
(mode.key[0] != 0 && irccmp(mode.key, oldmode->key) != 0))) (mode.key[0] != 0 && irccmp(mode.key, oldmode->key) != 0)))
{ {
struct membership *msptr; struct membership *msptr;