diff options
-rw-r--r-- | data/nickserv.example.conf | 7 | ||||
-rw-r--r-- | include/config.h | 2 | ||||
-rw-r--r-- | modules/protocol/inspircd20.cpp | 4 | ||||
-rw-r--r-- | modules/protocol/unreal.cpp | 11 | ||||
-rw-r--r-- | src/config.cpp | 1 | ||||
-rw-r--r-- | src/users.cpp | 5 |
6 files changed, 24 insertions, 6 deletions
diff --git a/data/nickserv.example.conf b/data/nickserv.example.conf index c6a07354f..16f241fd3 100644 --- a/data/nickserv.example.conf +++ b/data/nickserv.example.conf @@ -278,6 +278,13 @@ nickserv * This directive is opional. */ restoreonghost = yes + + /* + * Some IRCds allow "SASL" authentication to let users identify to Services + * during the IRCd user registration process. If set, Services will allow + * authenticating users through this mechanism. + */ + sasl = yes } /* diff --git a/include/config.h b/include/config.h index dd00d2666..86a232485 100644 --- a/include/config.h +++ b/include/config.h @@ -572,6 +572,8 @@ class CoreExport ServerConfig Anope::string NSModesOnID; /* Restore nick/channels on ghost */ bool NSRestoreOnGhost; + /* Whether or not to use SASL */ + bool NSSASL; /* Core ChanServ modules */ Anope::string ChanCoreModules; diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index 8dbdfb2ff..9bb3d9e1a 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -483,7 +483,7 @@ struct IRCDMessageEncap : IRCDMessage u->SetRealname(params[3]); UplinkSocket::Message(u) << "FNAME " << params[3]; } - else if (params[1] == "SASL" && params.size() == 6) + else if (Config->NSSASL && params[1] == "SASL" && params.size() == 6) { class InspIRCDSASLIdentifyRequest : public IdentifyRequest { @@ -501,6 +501,8 @@ struct IRCDMessageEncap : IRCDMessage void OnFail() anope_override { UplinkSocket::Message(Me) << "ENCAP " << this->uid.substr(0, 3) << " SASL " << Me->GetSID() << " " << this->uid << " " << " D F"; + + Log(findbot(Config->NickServ)) << "A user failed to identify for account " << this->GetAccount() << " using SASL"; } }; diff --git a/modules/protocol/unreal.cpp b/modules/protocol/unreal.cpp index 03a63687f..62157b8b4 100644 --- a/modules/protocol/unreal.cpp +++ b/modules/protocol/unreal.cpp @@ -867,7 +867,7 @@ struct IRCDMessageSASL : IRCDMessage return; UplinkSocket::Message(Me) << "SVSLOGIN " << this->uid.substr(0, p) << " " << this->uid << " " << this->GetAccount(); - UplinkSocket::Message(findbot(Config->NickServ)) << "SASL " << this->uid.substr(0, p) << " " << this->uid << " D S"; + UplinkSocket::Message() << "SASL " << this->uid.substr(0, p) << " " << this->uid << " D S"; } void OnFail() anope_override @@ -876,7 +876,9 @@ struct IRCDMessageSASL : IRCDMessage if (p == Anope::string::npos) return; - UplinkSocket::Message(findbot(Config->NickServ)) << "SASL " << this->uid.substr(0, p) << " " << this->uid << " D F"; + UplinkSocket::Message() << "SASL " << this->uid.substr(0, p) << " " << this->uid << " D F"; + + Log(findbot(Config->NickServ)) << "A user failed to identify for account " << this->GetAccount() << " using SASL"; } }; @@ -893,12 +895,11 @@ struct IRCDMessageSASL : IRCDMessage bool Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override { size_t p = params[1].find('!'); - if (p == Anope::string::npos) + if (!Config->NSSASL || p == Anope::string::npos) return true; - /* Unreal segfaults if we send from Me */ if (params[2] == "S") - UplinkSocket::Message(findbot(Config->NickServ)) << "SASL " << params[1].substr(0, p) << " " << params[1] << " C +"; + UplinkSocket::Message() << "SASL " << params[1].substr(0, p) << " " << params[1] << " C +"; else if (params[2] == "C") { Anope::string decoded; diff --git a/src/config.cpp b/src/config.cpp index 3f35a2ef2..be12c3479 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -1285,6 +1285,7 @@ ConfigItems::ConfigItems(ServerConfig *conf) {"nickserv", "kill", "60", new ValueContainerTime(&conf->NSKill), DT_TIME, NoValidation}, {"nickserv", "modesonid", "", new ValueContainerString(&conf->NSModesOnID), DT_STRING, NoValidation}, {"nickserv", "restoreonghost", "yes", new ValueContainerBool(&conf->NSRestoreOnGhost), DT_BOOLEAN, NoValidation}, + {"nickserv", "sasl", "yes", new ValueContainerBool(&conf->NSSASL), DT_BOOLEAN, NoValidation}, {"mail", "usemail", "no", new ValueContainerBool(&conf->UseMail), DT_BOOLEAN, ValidateEmailReg}, {"mail", "sendmailpath", "", new ValueContainerString(&conf->SendMailPath), DT_STRING, ValidateMail}, {"mail", "sendfrom", "", new ValueContainerString(&conf->SendFrom), DT_STRING, ValidateMail}, diff --git a/src/users.cpp b/src/users.cpp index 684817d2e..f536115d4 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -455,6 +455,9 @@ void User::Login(NickCore *core) core->Users.push_back(this); this->UpdateHost(); + + if (this->server->IsSynced()) + Log(this, "account") << "is now identified as " << this->nc->display; } /** Logout the user @@ -463,6 +466,8 @@ void User::Logout() { if (!this->nc) return; + + Log(this, "account") << "is not longer identified as " << this->nc->display; std::list<User *>::iterator it = std::find(this->nc->Users.begin(), this->nc->Users.end(), this); if (it != this->nc->Users.end()) |