summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-10-03 20:29:23 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-10-03 20:29:23 +0000
commitd4fe0b555c2a04968b50896cd094e65fe559dfd3 (patch)
tree4a7ddd015a48c699876ad4a74fd79eb7bd69de99
parente25e200024db92c4584660e9d144902cfd4d626e (diff)
Fake direction check in FJOIN on all users, plus tidyup of the code that forms the modeline for giving them their privilages
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5405 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/modules/m_spanningtree.cpp29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp
index 8503386a0..e94209885 100644
--- a/src/modules/m_spanningtree.cpp
+++ b/src/modules/m_spanningtree.cpp
@@ -1585,13 +1585,16 @@ class TreeSocket : public InspSocket
{
char* permissions = usr;
int ntimes = 0;
- while ((*permissions) && (*permissions != ','))
+ char* nm = new char[MAXBUF];
+ char* tnm = nm;
+
+ while ((*permissions) && (*permissions != ',') && (ntimes < MAXBUF))
{
ModeHandler* mh = Instance->Modes->FindPrefix(*permissions);
if (mh)
{
ntimes++;
- charlcat(modestring,mh->GetModeChar(),MAXBUF);
+ *tnm++ = mh->GetModeChar();
}
else
{
@@ -1602,22 +1605,33 @@ class TreeSocket : public InspSocket
usr++;
permissions++;
}
- usr++;
- /* Did they get any modes? How many times? */
- for (int k = 0; k < ntimes; k++)
- mode_users[modectr++] = strdup(usr);
+ *tnm = 0;
+ usr++;
who = this->Instance->FindNick(usr);
if (who)
{
+ /* Did they get any modes? How many times? */
+ strlcat(modestring, nm, MAXBUF);
+ for (int k = 0; k < ntimes; k++)
+ mode_users[modectr++] = strdup(usr);
+
+ delete[] nm;
+
+ TreeServer* route_back_again = BestRouteTo(who->server);
+ if ((!route_back_again) || (route_back_again->GetSocket() != this))
+ {
+ Instance->Log(DEBUG,"Fake direction in FJOIN, user '%s'",who->nick);
+ continue;
+ }
chanrec::JoinUser(this->Instance, who, channel.c_str(), true, key);
if (modectr >= (MAXMODES-1))
{
/* theres a mode for this user. push them onto the mode queue, and flush it
* if there are more than MAXMODES to go.
*/
- if ((ourTS >= TS) || (this->Instance->ULine(who->server)))
+ if (ourTS >= TS)
{
/* We also always let u-lined clients win, no matter what the TS value */
Instance->Log(DEBUG,"Our our channel newer than theirs, accepting their modes");
@@ -1637,6 +1651,7 @@ class TreeSocket : public InspSocket
}
else
{
+ delete[] nm;
Instance->Log(SPARSE,"Warning! Invalid user in FJOIN to channel %s IGNORED", channel.c_str());
continue;
}