summaryrefslogtreecommitdiff
path: root/modules/protocol/inspircd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/protocol/inspircd.cpp')
-rw-r--r--modules/protocol/inspircd.cpp32
1 files changed, 18 insertions, 14 deletions
diff --git a/modules/protocol/inspircd.cpp b/modules/protocol/inspircd.cpp
index e76d745e3..3183e59ee 100644
--- a/modules/protocol/inspircd.cpp
+++ b/modules/protocol/inspircd.cpp
@@ -75,6 +75,7 @@ class InspIRCdProto : public IRCDProto
CanSQLineChannel = true;
CanSZLine = true;
CanSVSHold = true;
+ CanSVSLogout = true;
CanCertFP = true;
CanSendTags = true;
RequiresID = true;
@@ -461,27 +462,30 @@ class InspIRCdProto : public IRCDProto
{
SendAccount(uid, na);
- if (!na->GetVhostIdent().empty())
- UplinkSocket::Message(Me) << "ENCAP " << uid.substr(0, 3) << " CHGIDENT " << uid << " " << na->GetVhostIdent();
- if (!na->GetVhostHost().empty())
- UplinkSocket::Message(Me) << "ENCAP " << uid.substr(0, 3) << " CHGHOST " << uid << " " << na->GetVhostHost();
-
- SASLUser su;
- su.uid = uid;
- su.acc = na->nc->display;
- su.created = Anope::CurTime;
-
- for (std::list<SASLUser>::iterator it = saslusers.begin(); it != saslusers.end();)
+ // Expire old pending sessions or other sessions for this user.
+ for (auto it = saslusers.begin(); it != saslusers.end(); )
{
- SASLUser &u = *it;
-
+ const SASLUser &u = *it;
if (u.created + 30 < Anope::CurTime || u.uid == uid)
it = saslusers.erase(it);
else
++it;
}
- saslusers.push_back(su);
+ if (na)
+ {
+ if (!na->GetVhostIdent().empty())
+ UplinkSocket::Message(Me) << "ENCAP " << uid.substr(0, 3) << " CHGIDENT " << uid << " " << na->GetVhostIdent();
+ if (!na->GetVhostHost().empty())
+ UplinkSocket::Message(Me) << "ENCAP " << uid.substr(0, 3) << " CHGHOST " << uid << " " << na->GetVhostHost();
+
+ // Mark this SASL session as pending user introduction.
+ SASLUser su;
+ su.uid = uid;
+ su.acc = na->nc->display;
+ su.created = Anope::CurTime;
+ saslusers.push_back(su);
+ }
}
bool IsExtbanValid(const Anope::string &mask) override