mirror of
https://github.com/anope/anope.git
synced 2026-07-08 13:03:13 +02:00
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3acf74483c | |||
| a3ec8329f4 | |||
| 31bc597c81 | |||
| 2de0dddb1c | |||
| 41ea346551 | |||
| 439ad3e736 | |||
| 8105607257 | |||
| ccc088d946 | |||
| 8bb83f6b1a | |||
| da99a53dfa | |||
| a9e9ac32a0 | |||
| 05e6df23a2 | |||
| 3f9fc23270 | |||
| afe87bf693 | |||
| 0c5bf51378 | |||
| d41764bfd6 | |||
| 10f4724b6b | |||
| 8d5be77c93 | |||
| f4bd43e898 | |||
| 7d7664444a | |||
| 1a8bbd6004 | |||
| e725c880a9 | |||
| f5abcd1c4c | |||
| 1986aa6581 | |||
| 1a6060ac5b | |||
| 6f57907416 | |||
| b09632d1c3 | |||
| cd614831de | |||
| 9649dc78a1 |
@@ -4,3 +4,4 @@ updates:
|
|||||||
directory: /
|
directory: /
|
||||||
schedule:
|
schedule:
|
||||||
interval: monthly
|
interval: monthly
|
||||||
|
target-branch: "2.1"
|
||||||
|
|||||||
@@ -109,10 +109,9 @@ module
|
|||||||
/*
|
/*
|
||||||
* The length of time before a channel registration expires.
|
* The length of time before a channel registration expires.
|
||||||
*
|
*
|
||||||
* This directive is optional, but recommended.
|
* This directive is optional. If not set, the default is never.
|
||||||
* If not set, the default is 14 days.
|
|
||||||
*/
|
*/
|
||||||
expire = 14d
|
#expire = 90d
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The maximum number of entries on a channel's access list.
|
* The maximum number of entries on a channel's access list.
|
||||||
|
|||||||
+1
-6
@@ -259,7 +259,7 @@ serverinfo
|
|||||||
* - hybrid
|
* - hybrid
|
||||||
* - inspircd12
|
* - inspircd12
|
||||||
* - inspircd20
|
* - inspircd20
|
||||||
* - inspircd3
|
* - inspircd3 (for 3.x and 4.x)
|
||||||
* - ngircd
|
* - ngircd
|
||||||
* - plexus
|
* - plexus
|
||||||
* - ratbox
|
* - ratbox
|
||||||
@@ -1153,11 +1153,6 @@ module
|
|||||||
* This is only useful with very large databases, with hundreds
|
* This is only useful with very large databases, with hundreds
|
||||||
* of thousands of objects, that have a noticeable delay from
|
* of thousands of objects, that have a noticeable delay from
|
||||||
* writing databases.
|
* writing databases.
|
||||||
*
|
|
||||||
* If your database is large enough cause a noticeable delay when
|
|
||||||
* saving you should consider a more powerful alternative such
|
|
||||||
* as db_sql or db_redis, which incrementally update their
|
|
||||||
* databases asynchronously in real time.
|
|
||||||
*/
|
*/
|
||||||
fork = no
|
fork = no
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ serverinfo
|
|||||||
* - hybrid
|
* - hybrid
|
||||||
* - inspircd12
|
* - inspircd12
|
||||||
* - inspircd20
|
* - inspircd20
|
||||||
* - inspircd3
|
* - inspircd3 (for 3.x and 4.x)
|
||||||
* - ngircd
|
* - ngircd
|
||||||
* - plexus
|
* - plexus
|
||||||
* - ratbox
|
* - ratbox
|
||||||
|
|||||||
+24
-3
@@ -1,6 +1,27 @@
|
|||||||
Anope Version 2.0.16-git
|
Anope Version 2.0.16
|
||||||
------------------------
|
--------------------
|
||||||
No significant changes.
|
Added a workaround for users matching expired sqlines.
|
||||||
|
Fixed a copy/paste error in webcpanel.
|
||||||
|
Fixed a crash in db_flatfile caused by trying to serialize data without a type.
|
||||||
|
Fixed duplicate messages when synconset/syncongroup is set.
|
||||||
|
Fixed expiring channel suspensions.
|
||||||
|
Fixed expiring forbids.
|
||||||
|
Fixed expiring nick suspensions.
|
||||||
|
Fixed feature detection on InspIRCd.
|
||||||
|
Fixed InspIRCd account cloaks causing CHGHOST spam when a user also has a services vhost.
|
||||||
|
Fixed joining users to channels with a key set on InspIRCd.
|
||||||
|
Fixed logging users out fully when their nick gets suspended.
|
||||||
|
Fixed marking boolean columns in SQL as TEXT instead of INT.
|
||||||
|
Fixed matching extbans on InspIRCd and implement missing matchers.
|
||||||
|
Fixed operserv/sqline expiry on UnrealIRCd
|
||||||
|
Fixed respecting --noexpire in cs_suspend and ns_suspend.
|
||||||
|
Fixed sending emails to nicks ending with a backslash.
|
||||||
|
Fixed sending SVSTOPIC when topiclock is loaded on InspIRCd.
|
||||||
|
Fixed some SQL tables taking up too much space on disk.
|
||||||
|
Fixed the default config for channel suspensions.
|
||||||
|
Fixed the TIME message on InspIRCd.
|
||||||
|
Fixed trying to escape SQL data when not connected to MySQL.
|
||||||
|
Fixed {ldap,sql}_authentication creating zombie accounts on expiry.
|
||||||
|
|
||||||
Anope Version 2.0.15
|
Anope Version 2.0.15
|
||||||
--------------------
|
--------------------
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
Anope Version 2.0.16-git
|
Anope Version 2.0.16
|
||||||
------------------------
|
--------------------
|
||||||
No significant changes.
|
No significant changes.
|
||||||
|
|
||||||
Anope Version 2.0.15
|
Anope Version 2.0.15
|
||||||
|
|||||||
@@ -190,6 +190,7 @@ class SerializableExtensibleItem<bool> : public PrimitiveExtensibleItem<bool>
|
|||||||
|
|
||||||
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const anope_override
|
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const anope_override
|
||||||
{
|
{
|
||||||
|
data.SetType(this->name, Serialize::Data::DT_INT);
|
||||||
data[this->name] << true;
|
data[this->name] << true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,17 +51,16 @@ struct KickerDataImpl : KickerData
|
|||||||
if (kd == NULL)
|
if (kd == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
data["kickerdata:amsgs"] << kd->amsgs;
|
data.SetType("kickerdata:amsgs", Serialize::Data::DT_INT); data["kickerdata:amsgs"] << kd->amsgs;
|
||||||
data["kickerdata:badwords"] << kd->badwords;
|
data.SetType("kickerdata:badwords", Serialize::Data::DT_INT); data["kickerdata:badwords"] << kd->badwords;
|
||||||
data["kickerdata:bolds"] << kd->bolds;
|
data.SetType("kickerdata:bolds", Serialize::Data::DT_INT); data["kickerdata:bolds"] << kd->bolds;
|
||||||
data["kickerdata:caps"] << kd->caps;
|
data.SetType("kickerdata:caps", Serialize::Data::DT_INT); data["kickerdata:caps"] << kd->caps;
|
||||||
data["kickerdata:colors"] << kd->colors;
|
data.SetType("kickerdata:colors", Serialize::Data::DT_INT); data["kickerdata:colors"] << kd->colors;
|
||||||
data["kickerdata:flood"] << kd->flood;
|
data.SetType("kickerdata:flood", Serialize::Data::DT_INT); data["kickerdata:flood"] << kd->flood;
|
||||||
data["kickerdata:italics"] << kd->italics;
|
data.SetType("kickerdata:italics", Serialize::Data::DT_INT); data["kickerdata:italics"] << kd->italics;
|
||||||
data["kickerdata:repeat"] << kd->repeat;
|
data.SetType("kickerdata:repeat", Serialize::Data::DT_INT); data["kickerdata:repeat"] << kd->repeat;
|
||||||
data["kickerdata:reverses"] << kd->reverses;
|
data.SetType("kickerdata:reverses", Serialize::Data::DT_INT); data["kickerdata:reverses"] << kd->reverses;
|
||||||
data["kickerdata:underlines"] << kd->underlines;
|
data.SetType("kickerdata:underlines", Serialize::Data::DT_INT); data["kickerdata:underlines"] << kd->underlines;
|
||||||
|
|
||||||
data.SetType("capsmin", Serialize::Data::DT_INT); data["capsmin"] << kd->capsmin;
|
data.SetType("capsmin", Serialize::Data::DT_INT); data["capsmin"] << kd->capsmin;
|
||||||
data.SetType("capspercent", Serialize::Data::DT_INT); data["capspercent"] << kd->capspercent;
|
data.SetType("capspercent", Serialize::Data::DT_INT); data["capspercent"] << kd->capspercent;
|
||||||
data.SetType("floodlines", Serialize::Data::DT_INT); data["floodlines"] << kd->floodlines;
|
data.SetType("floodlines", Serialize::Data::DT_INT); data["floodlines"] << kd->floodlines;
|
||||||
|
|||||||
@@ -210,6 +210,13 @@ class CSSuspend : public Module
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void Expire(ChannelInfo *ci)
|
||||||
|
{
|
||||||
|
suspend.Unset(ci);
|
||||||
|
Log(this) << "Expiring suspend for " << ci->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Show(CommandSource &source, const Anope::string &what) const
|
bool Show(CommandSource &source, const Anope::string &what) const
|
||||||
{
|
{
|
||||||
return source.IsOper() || std::find(show.begin(), show.end(), what) != show.end();
|
return source.IsOper() || std::find(show.begin(), show.end(), what) != show.end();
|
||||||
@@ -255,23 +262,28 @@ class CSSuspend : public Module
|
|||||||
|
|
||||||
expire = false;
|
expire = false;
|
||||||
|
|
||||||
if (!si->expires)
|
if (!Anope::NoExpire && si->expires && si->expires < Anope::CurTime)
|
||||||
return;
|
|
||||||
|
|
||||||
if (si->expires < Anope::CurTime)
|
|
||||||
{
|
{
|
||||||
ci->last_used = Anope::CurTime;
|
ci->last_used = Anope::CurTime;
|
||||||
suspend.Unset(ci);
|
Expire(ci);
|
||||||
|
|
||||||
Log(this) << "Expiring suspend for " << ci->name;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EventReturn OnCheckKick(User *u, Channel *c, Anope::string &mask, Anope::string &reason) anope_override
|
EventReturn OnCheckKick(User *u, Channel *c, Anope::string &mask, Anope::string &reason) anope_override
|
||||||
{
|
{
|
||||||
if (u->HasMode("OPER") || !c->ci || !suspend.HasExt(c->ci))
|
if (u->HasMode("OPER") || !c->ci)
|
||||||
return EVENT_CONTINUE;
|
return EVENT_CONTINUE;
|
||||||
|
|
||||||
|
CSSuspendInfo *si = suspend.Get(c->ci);
|
||||||
|
if (!si)
|
||||||
|
return EVENT_CONTINUE;
|
||||||
|
|
||||||
|
if (!Anope::NoExpire && si->expires && si->expires < Anope::CurTime)
|
||||||
|
{
|
||||||
|
Expire(c->ci);
|
||||||
|
return EVENT_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
reason = Language::Translate(u, _("This channel may not be used."));
|
reason = Language::Translate(u, _("This channel may not be used."));
|
||||||
return EVENT_STOP;
|
return EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class CommandHSGroup : public Command
|
|||||||
for (unsigned i = 0; i < na->nc->aliases->size(); ++i)
|
for (unsigned i = 0; i < na->nc->aliases->size(); ++i)
|
||||||
{
|
{
|
||||||
NickAlias *nick = na->nc->aliases->at(i);
|
NickAlias *nick = na->nc->aliases->at(i);
|
||||||
if (nick)
|
if (nick && nick != na)
|
||||||
{
|
{
|
||||||
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
||||||
FOREACH_MOD(OnSetVhost, (nick));
|
FOREACH_MOD(OnSetVhost, (nick));
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ class CommandHSSetAll : public Command
|
|||||||
for (unsigned i = 0; i < na->nc->aliases->size(); ++i)
|
for (unsigned i = 0; i < na->nc->aliases->size(); ++i)
|
||||||
{
|
{
|
||||||
NickAlias *nick = na->nc->aliases->at(i);
|
NickAlias *nick = na->nc->aliases->at(i);
|
||||||
if (nick)
|
if (nick && nick != na)
|
||||||
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,6 +127,8 @@ class CommandNSSuspend : public Command
|
|||||||
User *u2 = User::Find(na2->nick, true);
|
User *u2 = User::Find(na2->nick, true);
|
||||||
if (u2)
|
if (u2)
|
||||||
{
|
{
|
||||||
|
IRCD->SendLogout(u2);
|
||||||
|
u2->RemoveMode(source.service, "REGISTERED");
|
||||||
u2->Logout();
|
u2->Logout();
|
||||||
if (nickserv)
|
if (nickserv)
|
||||||
nickserv->Collide(u2, na2);
|
nickserv->Collide(u2, na2);
|
||||||
@@ -222,6 +224,12 @@ class NSSuspend : public Module
|
|||||||
return source.IsOper() || std::find(show.begin(), show.end(), what) != show.end();
|
return source.IsOper() || std::find(show.begin(), show.end(), what) != show.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Expire(NickAlias *na)
|
||||||
|
{
|
||||||
|
suspend.Unset(na->nc);
|
||||||
|
Log(LOG_NORMAL, "nickserv/expire", Config->GetClient("NickServ")) << "Expiring suspend for " << na->nick;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NSSuspend(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
|
NSSuspend(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
|
||||||
commandnssuspend(this), commandnsunsuspend(this), suspend(this, "NS_SUSPENDED"),
|
commandnssuspend(this), commandnsunsuspend(this), suspend(this, "NS_SUSPENDED"),
|
||||||
@@ -262,15 +270,10 @@ class NSSuspend : public Module
|
|||||||
|
|
||||||
expire = false;
|
expire = false;
|
||||||
|
|
||||||
if (!s->expires)
|
if (!Anope::NoExpire && s->expires && s->expires < Anope::CurTime)
|
||||||
return;
|
|
||||||
|
|
||||||
if (s->expires < Anope::CurTime)
|
|
||||||
{
|
{
|
||||||
na->last_seen = Anope::CurTime;
|
na->last_seen = Anope::CurTime;
|
||||||
suspend.Unset(na->nc);
|
Expire(na);
|
||||||
|
|
||||||
Log(LOG_NORMAL, "nickserv/expire", Config->GetClient("NickServ")) << "Expiring suspend for " << na->nick;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,6 +283,12 @@ class NSSuspend : public Module
|
|||||||
if (!s)
|
if (!s)
|
||||||
return EVENT_CONTINUE;
|
return EVENT_CONTINUE;
|
||||||
|
|
||||||
|
if (!Anope::NoExpire && s->expires && s->expires < Anope::CurTime)
|
||||||
|
{
|
||||||
|
Expire(na);
|
||||||
|
return EVENT_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
u->SendMessage(Config->GetClient("NickServ"), NICK_X_SUSPENDED, u->nick.c_str());
|
u->SendMessage(Config->GetClient("NickServ"), NICK_X_SUSPENDED, u->nick.c_str());
|
||||||
return EVENT_STOP;
|
return EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,33 @@ class MyForbidService : public ForbidService
|
|||||||
|
|
||||||
inline std::vector<ForbidData *>& forbids(unsigned t) { return (*this->forbid_data)[t - 1]; }
|
inline std::vector<ForbidData *>& forbids(unsigned t) { return (*this->forbid_data)[t - 1]; }
|
||||||
|
|
||||||
|
void Expire(ForbidData *fd, unsigned ft, size_t idx)
|
||||||
|
{
|
||||||
|
Anope::string typestr;
|
||||||
|
switch (ft)
|
||||||
|
{
|
||||||
|
case FT_NICK:
|
||||||
|
typestr = "nick";
|
||||||
|
break;
|
||||||
|
case FT_CHAN:
|
||||||
|
typestr = "chan";
|
||||||
|
break;
|
||||||
|
case FT_EMAIL:
|
||||||
|
typestr = "email";
|
||||||
|
break;
|
||||||
|
case FT_REGISTER:
|
||||||
|
typestr = "register";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
typestr = "unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log(LOG_NORMAL, "expire/forbid", Config->GetClient("OperServ")) << "Expiring forbid for " << fd->mask << " type " << typestr;
|
||||||
|
this->forbids(ft).erase(this->forbids(ft).begin() + idx);
|
||||||
|
delete fd;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MyForbidService(Module *m) : ForbidService(m), forbid_data("ForbidData") { }
|
MyForbidService(Module *m) : ForbidService(m), forbid_data("ForbidData") { }
|
||||||
|
|
||||||
@@ -99,6 +126,12 @@ class MyForbidService : public ForbidService
|
|||||||
{
|
{
|
||||||
ForbidData *d = this->forbids(ftype)[i - 1];
|
ForbidData *d = this->forbids(ftype)[i - 1];
|
||||||
|
|
||||||
|
if (!Anope::NoExpire && d->expires && Anope::CurTime >= d->expires)
|
||||||
|
{
|
||||||
|
Expire(d, ftype, i - 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (Anope::Match(mask, d->mask, false, true))
|
if (Anope::Match(mask, d->mask, false, true))
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@@ -111,6 +144,12 @@ class MyForbidService : public ForbidService
|
|||||||
{
|
{
|
||||||
ForbidData *d = this->forbids(ftype)[i - 1];
|
ForbidData *d = this->forbids(ftype)[i - 1];
|
||||||
|
|
||||||
|
if (!Anope::NoExpire && d->expires && Anope::CurTime >= d->expires)
|
||||||
|
{
|
||||||
|
Expire(d, ftype, i - 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (d->mask.equals_ci(mask))
|
if (d->mask.equals_ci(mask))
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@@ -126,19 +165,7 @@ class MyForbidService : public ForbidService
|
|||||||
ForbidData *d = this->forbids(j).at(i - 1);
|
ForbidData *d = this->forbids(j).at(i - 1);
|
||||||
|
|
||||||
if (d->expires && !Anope::NoExpire && Anope::CurTime >= d->expires)
|
if (d->expires && !Anope::NoExpire && Anope::CurTime >= d->expires)
|
||||||
{
|
Expire(d, j, i - 1);
|
||||||
Anope::string ftype = "none";
|
|
||||||
if (d->type == FT_NICK)
|
|
||||||
ftype = "nick";
|
|
||||||
else if (d->type == FT_CHAN)
|
|
||||||
ftype = "chan";
|
|
||||||
else if (d->type == FT_EMAIL)
|
|
||||||
ftype = "email";
|
|
||||||
|
|
||||||
Log(LOG_NORMAL, "expire/forbid", Config->GetClient("OperServ")) << "Expiring forbid for " << d->mask << " type " << ftype;
|
|
||||||
this->forbids(j).erase(this->forbids(j).begin() + i - 1);
|
|
||||||
delete d;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
f.push_back(d);
|
f.push_back(d);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -324,6 +324,8 @@ class DBFlatFile : public Module, public Pipe
|
|||||||
{
|
{
|
||||||
Serializable *base = *it;
|
Serializable *base = *it;
|
||||||
Serialize::Type *s_type = base->GetSerializableType();
|
Serialize::Type *s_type = base->GetSerializableType();
|
||||||
|
if (!s_type)
|
||||||
|
continue;
|
||||||
|
|
||||||
data.fs = databases[s_type->GetOwner()];
|
data.fs = databases[s_type->GetOwner()];
|
||||||
if (!data.fs || !data.fs->is_open())
|
if (!data.fs || !data.fs->is_open())
|
||||||
|
|||||||
@@ -299,6 +299,15 @@ class ModuleLDAPAuthentication : public Module
|
|||||||
Anope::string new_dn = username_attribute + "=" + na->nick + "," + basedn;
|
Anope::string new_dn = username_attribute + "=" + na->nick + "," + basedn;
|
||||||
this->ldap->Add(&this->orinterface, new_dn, attributes);
|
this->ldap->Add(&this->orinterface, new_dn, attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnPreNickExpire(NickAlias *na, bool &expire) anope_override
|
||||||
|
{
|
||||||
|
// We can't let nicks expire if they still have a group or
|
||||||
|
// there will be a zombie account left over that can't be
|
||||||
|
// authenticated to.
|
||||||
|
if (na->nick == na->nc->display && na->nc->aliases->size() > 1)
|
||||||
|
expire = false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_INIT(ModuleLDAPAuthentication)
|
MODULE_INIT(ModuleLDAPAuthentication)
|
||||||
|
|||||||
@@ -339,9 +339,14 @@ Result MySQLService::RunQuery(const Query &query)
|
|||||||
{
|
{
|
||||||
this->Lock.Lock();
|
this->Lock.Lock();
|
||||||
|
|
||||||
Anope::string real_query = this->BuildQuery(query);
|
if (!this->CheckConnection())
|
||||||
|
{
|
||||||
|
this->Lock.Unlock();
|
||||||
|
return MySQLResult(query, query.query, mysql_error(this->sql));
|
||||||
|
}
|
||||||
|
|
||||||
if (this->CheckConnection() && !mysql_real_query(this->sql, real_query.c_str(), real_query.length()))
|
Anope::string real_query = this->BuildQuery(query);
|
||||||
|
if (!mysql_real_query(this->sql, real_query.c_str(), real_query.length()))
|
||||||
{
|
{
|
||||||
MYSQL_RES *res = mysql_store_result(this->sql);
|
MYSQL_RES *res = mysql_store_result(this->sql);
|
||||||
unsigned int id = mysql_insert_id(this->sql);
|
unsigned int id = mysql_insert_id(this->sql);
|
||||||
@@ -395,11 +400,11 @@ std::vector<Query> MySQLService::CreateTable(const Anope::string &table, const D
|
|||||||
|
|
||||||
query_text += ", `" + it->first + "` ";
|
query_text += ", `" + it->first + "` ";
|
||||||
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
||||||
query_text += "int(11)";
|
query_text += "int";
|
||||||
else
|
else
|
||||||
query_text += "text";
|
query_text += "text";
|
||||||
}
|
}
|
||||||
query_text += ", PRIMARY KEY (`id`), KEY `timestamp_idx` (`timestamp`))";
|
query_text += ", PRIMARY KEY (`id`), KEY `timestamp_idx` (`timestamp`)) ROW_FORMAT=DYNAMIC";
|
||||||
queries.push_back(query_text);
|
queries.push_back(query_text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -412,7 +417,7 @@ std::vector<Query> MySQLService::CreateTable(const Anope::string &table, const D
|
|||||||
|
|
||||||
Anope::string query_text = "ALTER TABLE `" + table + "` ADD `" + it->first + "` ";
|
Anope::string query_text = "ALTER TABLE `" + table + "` ADD `" + it->first + "` ";
|
||||||
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
||||||
query_text += "int(11)";
|
query_text += "int";
|
||||||
else
|
else
|
||||||
query_text += "text";
|
query_text += "text";
|
||||||
|
|
||||||
|
|||||||
@@ -143,6 +143,15 @@ class ModuleSQLAuthentication : public Module
|
|||||||
|
|
||||||
Log(LOG_DEBUG) << "m_sql_authentication: Checking authentication for " << req->GetAccount();
|
Log(LOG_DEBUG) << "m_sql_authentication: Checking authentication for " << req->GetAccount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnPreNickExpire(NickAlias *na, bool &expire) anope_override
|
||||||
|
{
|
||||||
|
// We can't let nicks expire if they still have a group or
|
||||||
|
// there will be a zombie account left over that can't be
|
||||||
|
// authenticated to.
|
||||||
|
if (na->nick == na->nc->display && na->nc->aliases->size() > 1)
|
||||||
|
expire = false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_INIT(ModuleSQLAuthentication)
|
MODULE_INIT(ModuleSQLAuthentication)
|
||||||
|
|||||||
@@ -66,9 +66,7 @@ class InspIRCd3Proto : public IRCDProto
|
|||||||
CanSetVHost = true;
|
CanSetVHost = true;
|
||||||
CanSetVIdent = true;
|
CanSetVIdent = true;
|
||||||
CanSQLine = true;
|
CanSQLine = true;
|
||||||
CanSQLineChannel = true;
|
|
||||||
CanSZLine = true;
|
CanSZLine = true;
|
||||||
CanSVSHold = true;
|
|
||||||
CanCertFP = true;
|
CanCertFP = true;
|
||||||
RequiresID = true;
|
RequiresID = true;
|
||||||
MaxModes = 20;
|
MaxModes = 20;
|
||||||
@@ -182,7 +180,7 @@ class InspIRCd3Proto : public IRCDProto
|
|||||||
|
|
||||||
void SendTopic(const MessageSource &source, Channel *c) anope_override
|
void SendTopic(const MessageSource &source, Channel *c) anope_override
|
||||||
{
|
{
|
||||||
if (Servers::Capab.count("SVSTOPIC"))
|
if (Servers::Capab.count("TOPICLOCK"))
|
||||||
{
|
{
|
||||||
UplinkSocket::Message(c->WhoSends()) << "SVSTOPIC " << c->name << " " << c->topic_ts << " " << c->topic_setter << " :" << c->topic;
|
UplinkSocket::Message(c->WhoSends()) << "SVSTOPIC " << c->name << " " << c->topic_ts << " " << c->topic_setter << " :" << c->topic;
|
||||||
}
|
}
|
||||||
@@ -396,9 +394,12 @@ class InspIRCd3Proto : public IRCDProto
|
|||||||
SendAddLine("Z", x->GetHost(), timeleft, x->by, x->GetReason());
|
SendAddLine("Z", x->GetHost(), timeleft, x->by, x->GetReason());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &other) anope_override
|
void SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &key) anope_override
|
||||||
{
|
{
|
||||||
UplinkSocket::Message(source) << "SVSJOIN " << u->GetUID() << " " << chan;
|
if (key.empty())
|
||||||
|
UplinkSocket::Message(source) << "SVSJOIN " << u->GetUID() << " " << chan;
|
||||||
|
else
|
||||||
|
UplinkSocket::Message(source) << "SVSJOIN " << u->GetUID() << " " << chan << " :" << key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string ¶m) anope_override
|
void SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string ¶m) anope_override
|
||||||
@@ -444,6 +445,7 @@ class InspIRCd3Proto : public IRCDProto
|
|||||||
if (na->nc->HasExt("UNCONFIRMED"))
|
if (na->nc->HasExt("UNCONFIRMED"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
IRCD->SendVhost(u, na->GetVhostIdent(), na->GetVhostHost());
|
||||||
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountid :" << na->nc->GetId();
|
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountid :" << na->nc->GetId();
|
||||||
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountname :" << na->nc->display;
|
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountname :" << na->nc->display;
|
||||||
}
|
}
|
||||||
@@ -931,8 +933,7 @@ struct IRCDMessageCapab : Message::Capab
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* reset CAPAB */
|
/* reset CAPAB */
|
||||||
Servers::Capab.insert("SERVERS");
|
Servers::Capab.clear();
|
||||||
Servers::Capab.insert("TOPICLOCK");
|
|
||||||
IRCD->CanSQLineChannel = false;
|
IRCD->CanSQLineChannel = false;
|
||||||
IRCD->CanSVSHold = false;
|
IRCD->CanSVSHold = false;
|
||||||
IRCD->DefaultPseudoclientModes = "+oI";
|
IRCD->DefaultPseudoclientModes = "+oI";
|
||||||
@@ -1238,11 +1239,15 @@ struct IRCDMessageCapab : Message::Capab
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!IRCD->CanSVSHold)
|
if (!IRCD->CanSVSHold)
|
||||||
Log() << "SVSHOLD missing, Usage disabled until module is loaded.";
|
Log() << "The remote server does not have the svshold module; fake users will be used for nick protection until the module is loaded.";
|
||||||
|
if (!IRCD->CanSQLineChannel)
|
||||||
|
Log() << "The remote server does not have the cban module; services will manually enforce forbidden channels until the module is loaded.";
|
||||||
if (!Servers::Capab.count("CHGHOST"))
|
if (!Servers::Capab.count("CHGHOST"))
|
||||||
Log() << "CHGHOST missing, Usage disabled until module is loaded.";
|
Log() << "The remote server does not have the chghost module; vhosts are disabled until the module is loaded.";
|
||||||
if (!Servers::Capab.count("CHGIDENT"))
|
if (!Servers::Capab.count("CHGIDENT"))
|
||||||
Log() << "CHGIDENT missing, Usage disabled until module is loaded.";
|
Log() << "The remote server does not have the chgident module; vidents are disabled until the module is loaded.";
|
||||||
|
if (!Servers::Capab.count("GLOBOPS"))
|
||||||
|
Log() << "The remote server does not have the globops module; oper notices will be sent as announcements until the module is loaded.";
|
||||||
}
|
}
|
||||||
|
|
||||||
Message::Capab::Run(source, params);
|
Message::Capab::Run(source, params);
|
||||||
@@ -1484,12 +1489,16 @@ class IRCDMessageMetadata : IRCDMessage
|
|||||||
required = true;
|
required = true;
|
||||||
else if (module.equals_cs("m_hidechans.so"))
|
else if (module.equals_cs("m_hidechans.so"))
|
||||||
required = true;
|
required = true;
|
||||||
|
else if (module.equals_cs("m_cban.so=glob") && plus)
|
||||||
|
IRCD->CanSQLineChannel = true;
|
||||||
|
if (module.equals_cs("m_cban.so") && !plus)
|
||||||
|
IRCD->CanSQLineChannel = false;
|
||||||
else if (module.equals_cs("m_chghost.so"))
|
else if (module.equals_cs("m_chghost.so"))
|
||||||
capab = "CHGHOST";
|
capab = "CHGHOST";
|
||||||
else if (module.equals_cs("m_chgident.so"))
|
else if (module.equals_cs("m_chgident.so"))
|
||||||
capab = "CHGIDENT";
|
capab = "CHGIDENT";
|
||||||
else if (module.equals_cs("m_svshold.so"))
|
else if (module.equals_cs("m_svshold.so"))
|
||||||
capab = "SVSHOLD";
|
IRCD->CanSVSHold = plus;
|
||||||
else if (module.equals_cs("m_rline.so"))
|
else if (module.equals_cs("m_rline.so"))
|
||||||
capab = "RLINE";
|
capab = "RLINE";
|
||||||
else if (module.equals_cs("m_topiclock.so"))
|
else if (module.equals_cs("m_topiclock.so"))
|
||||||
@@ -1504,9 +1513,9 @@ class IRCDMessageMetadata : IRCDMessage
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (plus)
|
if (plus && !capab.empty())
|
||||||
Servers::Capab.insert(capab);
|
Servers::Capab.insert(capab);
|
||||||
else
|
else if (!capab.empty())
|
||||||
Servers::Capab.erase(capab);
|
Servers::Capab.erase(capab);
|
||||||
|
|
||||||
Log() << "InspIRCd " << (plus ? "loaded" : "unloaded") << " module " << module << ", adjusted functionality";
|
Log() << "InspIRCd " << (plus ? "loaded" : "unloaded") << " module " << module << ", adjusted functionality";
|
||||||
@@ -1828,16 +1837,6 @@ struct IRCDMessageSQuit : Message::SQuit
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct IRCDMessageTime : IRCDMessage
|
|
||||||
{
|
|
||||||
IRCDMessageTime(Module *creator) : IRCDMessage(creator, "TIME", 2) { }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
|
||||||
{
|
|
||||||
UplinkSocket::Message(Me) << "TIME " << source.GetSource() << " " << params[1] << " " << Anope::CurTime;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct IRCDMessageUID : IRCDMessage
|
struct IRCDMessageUID : IRCDMessage
|
||||||
{
|
{
|
||||||
IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 8) { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
|
IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 8) { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
|
||||||
@@ -1901,6 +1900,7 @@ class ProtoInspIRCd3 : public Module
|
|||||||
Message::Privmsg message_privmsg;
|
Message::Privmsg message_privmsg;
|
||||||
Message::Quit message_quit;
|
Message::Quit message_quit;
|
||||||
Message::Stats message_stats;
|
Message::Stats message_stats;
|
||||||
|
Message::Time message_time;
|
||||||
|
|
||||||
/* Our message handlers */
|
/* Our message handlers */
|
||||||
IRCDMessageAway message_away;
|
IRCDMessageAway message_away;
|
||||||
@@ -1924,7 +1924,6 @@ class ProtoInspIRCd3 : public Module
|
|||||||
IRCDMessageSave message_save;
|
IRCDMessageSave message_save;
|
||||||
IRCDMessageServer message_server;
|
IRCDMessageServer message_server;
|
||||||
IRCDMessageSQuit message_squit;
|
IRCDMessageSQuit message_squit;
|
||||||
IRCDMessageTime message_time;
|
|
||||||
IRCDMessageUID message_uid;
|
IRCDMessageUID message_uid;
|
||||||
|
|
||||||
bool use_server_side_topiclock, use_server_side_mlock;
|
bool use_server_side_topiclock, use_server_side_mlock;
|
||||||
@@ -1938,12 +1937,12 @@ class ProtoInspIRCd3 : public Module
|
|||||||
ProtoInspIRCd3(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR),
|
ProtoInspIRCd3(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR),
|
||||||
ircd_proto(this), ssl(this, "ssl"),
|
ircd_proto(this), ssl(this, "ssl"),
|
||||||
message_error(this), message_invite(this), message_kill(this), message_motd(this), message_notice(this),
|
message_error(this), message_invite(this), message_kill(this), message_motd(this), message_notice(this),
|
||||||
message_part(this), message_privmsg(this), message_quit(this), message_stats(this),
|
message_part(this), message_privmsg(this), message_quit(this), message_stats(this), message_time(this),
|
||||||
message_away(this), message_capab(this), message_encap(this), message_endburst(this), message_fhost(this),
|
message_away(this), message_capab(this), message_encap(this), message_endburst(this), message_fhost(this),
|
||||||
message_fident(this), message_fjoin(this), message_fmode(this), message_ftopic(this), message_idle(this),
|
message_fident(this), message_fjoin(this), message_fmode(this), message_ftopic(this), message_idle(this),
|
||||||
message_ijoin(this), message_kick(this), message_metadata(this, use_server_side_topiclock, use_server_side_mlock, ircd_proto.maxlist),
|
message_ijoin(this), message_kick(this), message_metadata(this, use_server_side_topiclock, use_server_side_mlock, ircd_proto.maxlist),
|
||||||
message_mode(this), message_nick(this), message_opertype(this), message_ping(this), message_rsquit(this),
|
message_mode(this), message_nick(this), message_opertype(this), message_ping(this), message_rsquit(this),
|
||||||
message_save(this), message_server(this), message_squit(this), message_time(this), message_uid(this)
|
message_save(this), message_server(this), message_squit(this), message_uid(this)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ class UnrealIRCdProto : public IRCDProto
|
|||||||
*/
|
*/
|
||||||
void SendSQLine(User *, const XLine *x) anope_override
|
void SendSQLine(User *, const XLine *x) anope_override
|
||||||
{
|
{
|
||||||
UplinkSocket::Message() << "SQLINE " << x->mask << " :" << x->GetReason();
|
UplinkSocket::Message() << "TKL + Q * " << x->mask << " " << x->by << " " << x->expires << " " << x->created << " :" << x->GetReason();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Functions that use serval cmd functions */
|
/* Functions that use serval cmd functions */
|
||||||
|
|||||||
@@ -126,6 +126,9 @@ class SQLineManager : public XLineManager
|
|||||||
{
|
{
|
||||||
XLine *x = *it;
|
XLine *x = *it;
|
||||||
|
|
||||||
|
if (!Anope::NoExpire && x->expires && x->expires < Anope::CurTime)
|
||||||
|
continue; // Skip expired lines.
|
||||||
|
|
||||||
if (x->regex)
|
if (x->regex)
|
||||||
{
|
{
|
||||||
if (x->regex->Matches(c->name))
|
if (x->regex->Matches(c->name))
|
||||||
|
|||||||
+1
-1
@@ -48,7 +48,7 @@ void Mail::Message::Run()
|
|||||||
if (this->dont_quote_addresses)
|
if (this->dont_quote_addresses)
|
||||||
fprintf(pipe, "To: %s <%s>\r\n", mail_to.c_str(), addr.c_str());
|
fprintf(pipe, "To: %s <%s>\r\n", mail_to.c_str(), addr.c_str());
|
||||||
else
|
else
|
||||||
fprintf(pipe, "To: \"%s\" <%s>\r\n", mail_to.c_str(), addr.c_str());
|
fprintf(pipe, "To: \"%s\" <%s>\r\n", mail_to.replace_all_cs("\\", "\\\\").c_str(), addr.c_str());
|
||||||
fprintf(pipe, "Subject: %s\r\n", subject.c_str());
|
fprintf(pipe, "Subject: %s\r\n", subject.c_str());
|
||||||
fprintf(pipe, "Content-Type: %s\r\n", content_type.c_str());
|
fprintf(pipe, "Content-Type: %s\r\n", content_type.c_str());
|
||||||
fprintf(pipe, "Content-Transfer-Encoding: 8bit\r\n");
|
fprintf(pipe, "Content-Transfer-Encoding: 8bit\r\n");
|
||||||
|
|||||||
+1
-1
@@ -3,4 +3,4 @@
|
|||||||
VERSION_MAJOR=2
|
VERSION_MAJOR=2
|
||||||
VERSION_MINOR=0
|
VERSION_MINOR=0
|
||||||
VERSION_PATCH=16
|
VERSION_PATCH=16
|
||||||
VERSION_EXTRA="-git"
|
VERSION_EXTRA=""
|
||||||
|
|||||||
Reference in New Issue
Block a user