mirror of
https://github.com/anope/anope.git
synced 2026-07-01 11:46:37 +02:00
Merge branch '2.0' into 2.1.
This commit is contained in:
@@ -230,7 +230,12 @@ class CommandCSAccess : public Command
|
||||
{
|
||||
Anope::string mask = params[2];
|
||||
|
||||
if (!isdigit(mask[0]) && mask.find_first_of("#!*@") == Anope::string::npos && !NickAlias::Find(mask))
|
||||
const NickAlias *na = NickAlias::Find(mask);
|
||||
if (na && na->nc)
|
||||
{
|
||||
mask = na->nc->display;
|
||||
}
|
||||
else if (!isdigit(mask[0]) && mask.find_first_of("#!*@") == Anope::string::npos)
|
||||
{
|
||||
User *targ = User::Find(mask, true);
|
||||
if (targ != NULL)
|
||||
|
||||
@@ -251,7 +251,12 @@ class CommandCSXOP : public Command
|
||||
const ChanAccess *highest = access.Highest();
|
||||
bool override = false;
|
||||
|
||||
if (!isdigit(mask[0]) && mask.find_first_of("#!*@") == Anope::string::npos && !NickAlias::Find(mask))
|
||||
const NickAlias *na = NickAlias::Find(mask);
|
||||
if (na && na->nc)
|
||||
{
|
||||
mask = na->nc->display;
|
||||
}
|
||||
else if (!isdigit(mask[0]) && mask.find_first_of("#!*@") == Anope::string::npos)
|
||||
{
|
||||
User *targ = User::Find(mask, true);
|
||||
if (targ != NULL)
|
||||
|
||||
@@ -25,13 +25,15 @@ class CommandNSConfirm : public Command
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
|
||||
{
|
||||
const Anope::string &passcode = params[0];
|
||||
Anope::string *code = source.nc ? source.nc->GetExt<Anope::string>("passcode") : NULL;
|
||||
bool confirming_other = !code || *code != params[0];
|
||||
|
||||
if (source.nc && (!source.nc->HasExt("UNCONFIRMED") || source.IsOper()) && source.HasPriv("nickserv/confirm"))
|
||||
if (source.nc && (!source.nc->HasExt("UNCONFIRMED") || (source.IsOper() && confirming_other)) && source.HasPriv("nickserv/confirm"))
|
||||
{
|
||||
NickAlias *na = NickAlias::Find(passcode);
|
||||
const Anope::string &nick = params[0];
|
||||
NickAlias *na = NickAlias::Find(nick);
|
||||
if (na == NULL)
|
||||
source.Reply(NICK_X_NOT_REGISTERED, passcode.c_str());
|
||||
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
|
||||
else if (na->nc->HasExt("UNCONFIRMED") == false)
|
||||
source.Reply(_("Nick \002%s\002 is already confirmed."), na->nick.c_str());
|
||||
else
|
||||
@@ -58,7 +60,7 @@ class CommandNSConfirm : public Command
|
||||
}
|
||||
else if (source.nc)
|
||||
{
|
||||
Anope::string *code = source.nc->GetExt<Anope::string>("passcode");
|
||||
const Anope::string &passcode = params[0];
|
||||
if (code != NULL && *code == passcode)
|
||||
{
|
||||
NickCore *nc = source.nc;
|
||||
|
||||
+28
-18
@@ -25,37 +25,47 @@ class Plain : public Mechanism
|
||||
}
|
||||
else if (m.type == "C")
|
||||
{
|
||||
Anope::string decoded;
|
||||
Anope::B64Decode(m.data, decoded);
|
||||
// message = [authzid] UTF8NUL authcid UTF8NUL passwd
|
||||
Anope::string message;
|
||||
Anope::B64Decode(m.data, message);
|
||||
|
||||
size_t p = decoded.find('\0');
|
||||
if (p == Anope::string::npos)
|
||||
{
|
||||
sasl->Fail(sess);
|
||||
delete sess;
|
||||
return;
|
||||
}
|
||||
decoded = decoded.substr(p + 1);
|
||||
|
||||
p = decoded.find('\0');
|
||||
if (p == Anope::string::npos)
|
||||
size_t zcsep = message.find('\0');
|
||||
if (zcsep == Anope::string::npos)
|
||||
{
|
||||
sasl->Fail(sess);
|
||||
delete sess;
|
||||
return;
|
||||
}
|
||||
|
||||
Anope::string acc = decoded.substr(0, p),
|
||||
pass = decoded.substr(p + 1);
|
||||
|
||||
if (acc.empty() || pass.empty() || !IRCD->IsNickValid(acc) || pass.find_first_of("\r\n") != Anope::string::npos)
|
||||
size_t cpsep = message.find('\0', zcsep + 1);
|
||||
if (cpsep == Anope::string::npos)
|
||||
{
|
||||
sasl->Fail(sess);
|
||||
delete sess;
|
||||
return;
|
||||
}
|
||||
|
||||
SASL::IdentifyRequest *req = new SASL::IdentifyRequest(this->owner, m.source, acc, pass, sess->hostname, sess->ip);
|
||||
Anope::string authzid = message.substr(0, zcsep);
|
||||
Anope::string authcid = message.substr(zcsep + 1, cpsep - zcsep - 1);
|
||||
|
||||
// We don't support having an authcid that is different to the authzid.
|
||||
if (!authzid.empty() && authzid != authcid)
|
||||
{
|
||||
sasl->Fail(sess);
|
||||
delete sess;
|
||||
return;
|
||||
}
|
||||
|
||||
Anope::string passwd = message.substr(cpsep + 1);
|
||||
|
||||
if (authcid.empty() || passwd.empty() || !IRCD->IsNickValid(authcid) || passwd.find_first_of("\r\n\0") != Anope::string::npos)
|
||||
{
|
||||
sasl->Fail(sess);
|
||||
delete sess;
|
||||
return;
|
||||
}
|
||||
|
||||
SASL::IdentifyRequest *req = new SASL::IdentifyRequest(this->owner, m.source, authcid, passwd, sess->hostname, sess->ip);
|
||||
FOREACH_MOD(OnCheckAuthentication, (NULL, req));
|
||||
req->Dispatch();
|
||||
}
|
||||
|
||||
@@ -120,6 +120,11 @@ class InspIRCdProto : public IRCDProto
|
||||
user->KillInternal(source, buf);
|
||||
}
|
||||
|
||||
void SendForceNickChange(User *u, const Anope::string &newnick, time_t when) override
|
||||
{
|
||||
UplinkSocket::Message() << "SVSNICK " << u->GetUID() << " " << newnick << " " << when << " " << u->timestamp;
|
||||
}
|
||||
|
||||
void SendGlobalNotice(BotInfo *bi, const Server *dest, const Anope::string &msg) override
|
||||
{
|
||||
UplinkSocket::Message(bi) << "NOTICE $" << dest->GetName() << " :" << msg;
|
||||
|
||||
Reference in New Issue
Block a user