From 989eaf9089c65d04dde1451bb7cded19092f638b Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Tue, 13 Dec 2005 23:45:55 +0000 Subject: [PATCH] Fix a possible net ride. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/branches/u2_10_12_branch@1575 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 6 ++++++ ircd/m_join.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/ChangeLog b/ChangeLog index ecf4f4a..e1738f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-12-13 Michael Poole + + * ircd/m_join.c (ms_join): Prevent net rides allowed by moving the + channel timestamp backwards in time without deopping current ops. + (Reported by Wouter Coekaerts.) + 2005-12-13 Michael Poole * doc/example.conf: Remove extraneous "Other" Client block. diff --git a/ircd/m_join.c b/ircd/m_join.c index 3a22b49..7bd6b1a 100644 --- a/ircd/m_join.c +++ b/ircd/m_join.c @@ -363,9 +363,37 @@ int ms_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) by one when someone joins an existing, but empty, channel. However, this is only necessary when the channel is still empty (also here) and when this channel doesn't have +A set. + + To prevent this from allowing net-rides on the channel, we + clear all ops from the channel. + + (Scenario for a net ride: c1 - s1 - s2 - c2, with c1 the only + user in the channel; c1 parts and rejoins, gaining ops. + Before s2 sees c1's part, c2 joins the channel and parts + immediately. s1 sees c1 part, c1 create, c2 join, c2 part; + c2's join resets the timestamp. s2 sees c2 join, c2 part, c1 + part, c1 create; but since s2 sees the channel as a zannel or + non-existent, it does not bounce the create with the newer + timestamp.) */ if (creation && creation - ((!chptr->mode.apass[0] && chptr->users == 0) ? 1 : 0) <= chptr->creationtime) + { + struct Membership *member; + struct ModeBuf mbuf; + chptr->creationtime = creation; + /* Deop the current ops. (This will go in both directions on + * the network, and revise the channel timestamp as it goes, + * avoiding further traffic due to the JOIN.) + */ + modebuf_init(&mbuf, sptr, cptr, chptr, MODEBUF_DEST_CHANNEL | MODEBUF_DEST_HACK3 | MODEBUF_DEST_SERVER); + for (member = chptr->members; member; member = member->next_member) + { + if (IsChanOp(member)) + modebuf_mode_client(&mbuf, MODE_DEL | MODE_CHANOP, member->user, OpLevel(member)); + } + modebuf_flush(&mbuf); + } } joinbuf_join(&join, chptr, flags); -- 2.20.1