summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modules/m_spanningtree/opertype.cpp7
-rw-r--r--src/modules/m_spanningtree/treesocket.h4
-rw-r--r--src/modules/m_spanningtree/treesocket2.cpp4
-rw-r--r--src/modules/m_spanningtree/uid.cpp10
4 files changed, 16 insertions, 9 deletions
diff --git a/src/modules/m_spanningtree/opertype.cpp b/src/modules/m_spanningtree/opertype.cpp
index 62016ccaf..c76425fda 100644
--- a/src/modules/m_spanningtree/opertype.cpp
+++ b/src/modules/m_spanningtree/opertype.cpp
@@ -24,7 +24,7 @@
/** Because the core won't let users or even SERVERS set +o,
* we use the OPERTYPE command to do this.
*/
-bool TreeSocket::OperType(const std::string &prefix, std::deque<std::string> &params)
+bool TreeSocket::OperType(const std::string &prefix, std::deque<std::string> &params, const std::string &up)
{
if (params.size() != 1)
return true;
@@ -39,16 +39,17 @@ bool TreeSocket::OperType(const std::string &prefix, std::deque<std::string> &pa
Utils->DoOneToAllButSender(u->uuid, "OPERTYPE", params, u->server);
TreeServer* remoteserver = Utils->FindServer(u->server);
+ TreeServer* uplink = Utils->FindServer(up);
bool dosend = true;
- if (this->Utils->quiet_bursts)
+ if (this->Utils->quiet_bursts && uplink)
{
/*
* If quiet bursts are enabled, and server is bursting or silent uline (i.e. services),
* then do nothing. -- w00t
*/
if (
- remoteserver->bursting ||
+ remoteserver->bursting || uplink->bursting ||
this->ServerInstance->SilentULine(this->ServerInstance->FindServerNamePtr(u->server))
)
{
diff --git a/src/modules/m_spanningtree/treesocket.h b/src/modules/m_spanningtree/treesocket.h
index 510052f31..6619d6ce9 100644
--- a/src/modules/m_spanningtree/treesocket.h
+++ b/src/modules/m_spanningtree/treesocket.h
@@ -220,7 +220,7 @@ class TreeSocket : public BufferedSocket
int DoCollision(User *u, time_t remotets, const std::string &remoteident, const std::string &remoteip, const std::string &remoteuid);
/** UID command */
- bool ParseUID(const std::string &source, std::deque<std::string> &params);
+ bool ParseUID(const std::string &source, std::deque<std::string> &params, const std::string &up);
/** Send one or more FJOINs for a channel of users.
* If the length of a single line is more than 480-NICKMAX
@@ -275,7 +275,7 @@ class TreeSocket : public BufferedSocket
/** Because the core won't let users or even SERVERS set +o,
* we use the OPERTYPE command to do this.
*/
- bool OperType(const std::string &prefix, std::deque<std::string> &params);
+ bool OperType(const std::string &prefix, std::deque<std::string> &params, const std::string &up);
/** Because Andy insists that services-compatible servers must
* implement SVSNICK and SVSJOIN, that's exactly what we do :p
diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp
index 22dcf293d..0c9d63a8c 100644
--- a/src/modules/m_spanningtree/treesocket2.cpp
+++ b/src/modules/m_spanningtree/treesocket2.cpp
@@ -315,7 +315,7 @@ bool TreeSocket::ProcessLine(std::string &line)
*/
if (command == "UID")
{
- return this->ParseUID(prefix, params);
+ return this->ParseUID(prefix, params, sourceserv);
}
else if (command == "FJOIN")
{
@@ -365,7 +365,7 @@ bool TreeSocket::ProcessLine(std::string &line)
}
else if (command == "OPERTYPE")
{
- return this->OperType(prefix,params);
+ return this->OperType(prefix, params, sourceserv);
}
else if (command == "FMODE")
{
diff --git a/src/modules/m_spanningtree/uid.cpp b/src/modules/m_spanningtree/uid.cpp
index 58a4a0e9d..697dbe689 100644
--- a/src/modules/m_spanningtree/uid.cpp
+++ b/src/modules/m_spanningtree/uid.cpp
@@ -23,7 +23,7 @@
/* $ModDep: m_spanningtree/resolvers.h m_spanningtree/main.h m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/link.h m_spanningtree/treesocket.h m_hash.h m_spanningtree/handshaketimer.h */
-bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> &params)
+bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> &params, const std::string &up)
{
/** Do we have enough parameters:
* 0 1 2 3 4 5 6 7 8 9 (n-1)
@@ -40,7 +40,13 @@ bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> &pa
std::string empty;
TreeServer* remoteserver = Utils->FindServer(source);
+ TreeServer* uplink = Utils->FindServer(up);
+ if (!uplink)
+ {
+ this->SendError("Invalid client introduction (Can't determine name of uplink!)");
+ return false;
+ }
if (!remoteserver)
{
this->SendError("Invalid client introduction (Unknown server "+source+")");
@@ -168,7 +174,7 @@ bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> &pa
bool dosend = true;
- if ((this->Utils->quiet_bursts && remoteserver->bursting) || this->ServerInstance->SilentULine(_new->server))
+ if ((this->Utils->quiet_bursts && (remoteserver->bursting || uplink->bursting)) || this->ServerInstance->SilentULine(_new->server))
dosend = false;
if (dosend)