1
0
mirror of https://github.com/anope/anope.git synced 2026-06-24 09:56:37 +02:00

Compare commits

...

8 Commits

Author SHA1 Message Date
Sadie Powell 73714420d1 Release 2.0.17. 2024-12-08 12:15:26 +00:00
Sadie Powell ea96f2ad40 Update the change log. 2024-12-08 12:13:28 +00:00
Sadie Powell 7083c424c2 Only process sockets after loading the db when using db_sql{_live}.
This avoids slow startups for the 95% of users who are using the
db_flatfile database backend.
2024-11-19 00:39:00 +00:00
Sadie Powell de16238e01 Process all socket events before connecting to the uplink.
This ensures that the SQL import actually succeeds before we do
something that might terminate the process.
2024-11-16 12:49:45 +00:00
Sadie Powell a668c8b520 Clarify how to import databases from flatfile to SQL.
Closes #456.
2024-11-15 15:57:41 +00:00
Sadie Powell 96ccfe4cbe Fix using User::Account where User::IsIdentified should be used.
The former causes a dereference which cause a database update. This
is not good for performance with db_sql_live on bigger networks.
2024-11-11 16:46:56 +00:00
Sadie Powell ee160842b3 Fix serialising boolean extension items. 2024-11-11 15:24:40 +00:00
Sadie Powell 98c840eb02 Expand the size of some chanstats columns.
Closes #444.
2024-11-07 12:31:47 +00:00
26 changed files with 56 additions and 38 deletions
+4 -3
View File
@@ -1184,9 +1184,10 @@ module
/* Whether or not to import data from another database module in to SQL on startup.
* If you enable this, be sure that the database services is configured to use is
* empty and that another database module to import from is loaded before db_sql.
* After you enable this and do a database import you should disable it for
* subsequent restarts.
* empty and that another database module to import from is loaded BEFORE db_sql.
* After you enable this and do a database import you MUST disable it for
* subsequent restarts. If you want to keep writing a flatfile database after the
* SQL import is done you should load db_flatfile AFTER this module.
*
* Note that you can not import databases using db_sql_live. If you want to import
* databases and use db_sql_live you should import them using db_sql, then shut down
+12 -3
View File
@@ -1,6 +1,15 @@
Anope Version 2.0.17-git
------------------------
No significant changes.
Anope Version 2.0.17
--------------------
Fixed importing large flatfile databases into SQL.
Fixed marking channels as permanent.
Fixed serialising unset boolean extension items.
Fixed the documentation about how to import SQL databases.
Fixed the documentation of options:usemail.
Fixed the location of the geoipupdate CSV files.
Fixed translating memo emails.
Fixed unnecessary SQL updates caused by dereferencing user accounts.
Increased the size of the chanstats letter and word count columns.
Updated the location of the Anope IRC channels.
Anope Version 2.0.16-git
------------------------
+2 -2
View File
@@ -1,5 +1,5 @@
Anope Version 2.0.17-git
------------------------
Anope Version 2.0.17
--------------------
No significant changes.
Anope Version 2.0.16
+1 -1
View File
@@ -191,7 +191,7 @@ class SerializableExtensibleItem<bool> : public PrimitiveExtensibleItem<bool>
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] << this->HasExt(e);
}
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) anope_override
+1 -1
View File
@@ -188,7 +188,7 @@ class Greet : public Module
* to has synced, or we'll get greet-floods when the net
* recovers from a netsplit. -GD
*/
if (!c->ci || !c->ci->bi || !user->server->IsSynced() || !user->Account())
if (!c->ci || !c->ci->bi || !user->server->IsSynced() || !user->IsIdentified())
return;
Anope::string *greet = ns_greet.Get(user->Account());
+1 -1
View File
@@ -82,7 +82,7 @@ class CommandNSIdentify : public Command
return;
}
if (u->Account() && na && u->Account() == na->nc)
if (u->IsIdentified() && na && u->Account() == na->nc)
{
source.Reply(_("You are already identified."));
return;
+3 -3
View File
@@ -1286,7 +1286,7 @@ class NSSet : public Module
if (chan->ci)
{
/* Only give modes if autoop is set */
give_modes &= !user->Account() || autoop.HasExt(user->Account());
give_modes &= !user->IsIdentified() || autoop.HasExt(user->Account());
}
}
@@ -1321,13 +1321,13 @@ class NSSet : public Module
void OnUserModeSet(const MessageSource &setter, User *u, const Anope::string &mname) anope_override
{
if (u->Account() && setter.GetUser() == u)
if (u->IsIdentified() && setter.GetUser() == u)
u->Account()->last_modes = u->GetModeList();
}
void OnUserModeUnset(const MessageSource &setter, User *u, const Anope::string &mname) anope_override
{
if (u->Account() && setter.GetUser() == u)
if (u->IsIdentified() && setter.GetUser() == u)
u->Account()->last_modes = u->GetModeList();
}
+1 -1
View File
@@ -36,7 +36,7 @@ class CommandNSStatus : public Command
else if (u2->IsIdentified() && na && na->nc == u2->Account()) /* Nick is identified */
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 3, u2->Account()->display.c_str());
else if (u2->IsRecognized()) /* Nick is recognised, but NOT identified */
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 2, u2->Account() ? u2->Account()->display.c_str() : "");
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 2, u2->IsIdentified() ? u2->Account()->display.c_str() : "");
else if (!na) /* Nick is online, but NOT a registered */
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 0, "");
else
+8
View File
@@ -159,6 +159,14 @@ class DBSQL : public Module, public Pipe
this->import = block->Get<bool>("import");
}
void OnPostInit() anope_override
{
// If we are importing from flatfile we need to force a socket engine
// flush to ensure it actually gets written to the database before we
// connect to the uplink.
SocketEngine::Process();
}
void OnShutdown() anope_override
{
this->shutting_down = true;
+1 -1
View File
@@ -143,7 +143,7 @@ class OnIdentifyInterface : public LDAPInterface
{
User *u = User::Find(uid);
if (!u || !u->Account() || r.empty())
if (!u || !u->IsIdentified() || r.empty())
return;
try
+1 -1
View File
@@ -23,7 +23,7 @@ class IdentifyInterface : public LDAPInterface
void OnResult(const LDAPResult &r) anope_override
{
if (!u || !u->Account())
if (!u || !u->IsIdentified())
return;
NickCore *nc = u->Account();
+1 -1
View File
@@ -46,7 +46,7 @@ class SQLOperResult : public SQL::Interface
{
SQLOperResultDeleter d(this);
if (!user || !user->Account())
if (!user || !user->IsIdentified())
return;
if (r.Rows() == 0)
+2 -2
View File
@@ -108,7 +108,7 @@ void IRC2SQL::OnUserConnect(User *u, bool &exempt)
query.SetValue("ident", u->GetIdent());
query.SetValue("vident", u->GetVIdent());
query.SetValue("secure", u->HasMode("SSL") || u->HasExt("ssl") ? "Y" : "N");
query.SetValue("account", u->Account() ? u->Account()->display : "");
query.SetValue("account", u->IsIdentified() ? u->Account()->display : "");
query.SetValue("fingerprint", u->fingerprint);
query.SetValue("signon", u->signon);
query.SetValue("server", u->server->GetName());
@@ -176,7 +176,7 @@ void IRC2SQL::OnUserLogin(User *u)
{
query = "UPDATE `" + prefix + "user` SET account=@account@ WHERE nick=@nick@";
query.SetValue("nick", u->nick);
query.SetValue("account", u->Account() ? u->Account()->display : "");
query.SetValue("account", u->IsIdentified() ? u->Account()->display : "");
this->RunQuery(query);
}
+5 -5
View File
@@ -207,7 +207,7 @@ class MChanstats : public Module
const Anope::string GetDisplay(User *u)
{
if (u && u->Account() && ns_stats.HasExt(u->Account()))
if (u && u->IsIdentified() && ns_stats.HasExt(u->Account()))
return u->Account()->display;
else
return "";
@@ -277,8 +277,8 @@ class MChanstats : public Module
"`chan` varchar(64) NOT NULL DEFAULT '',"
"`nick` varchar(64) NOT NULL DEFAULT '',"
"`type` ENUM('total', 'monthly', 'weekly', 'daily') NOT NULL,"
"`letters` int(10) unsigned NOT NULL DEFAULT '0',"
"`words` int(10) unsigned NOT NULL DEFAULT '0',"
"`letters` bigint unsigned NOT NULL DEFAULT '0',"
"`words` bigint unsigned NOT NULL DEFAULT '0',"
"`line` int(10) unsigned NOT NULL DEFAULT '0',"
"`actions` int(10) unsigned NOT NULL DEFAULT '0',"
"`smileys_happy` int(10) unsigned NOT NULL DEFAULT '0',"
@@ -527,7 +527,7 @@ class MChanstats : public Module
void OnTopicUpdated(User *source, Channel *c, const Anope::string &user, const Anope::string &topic) anope_override
{
if (!source || !source->Account() || !c->ci || !cs_stats.HasExt(c->ci))
if (!source || !source->IsIdentified() || !c->ci || !cs_stats.HasExt(c->ci))
return;
query = "CALL " + prefix + "chanstats_proc_update(@channel@, @nick@, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);";
query.SetValue("channel", c->name);
@@ -550,7 +550,7 @@ class MChanstats : public Module
private:
void OnModeChange(Channel *c, User *u)
{
if (!u || !u->Account() || !c->ci || !cs_stats.HasExt(c->ci))
if (!u || !u->IsIdentified() || !c->ci || !cs_stats.HasExt(c->ci))
return;
query = "CALL " + prefix + "chanstats_proc_update(@channel@, @nick@, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);";
+1 -1
View File
@@ -167,7 +167,7 @@ class Fantasy : public Module
}
// Command requires registered users only
if (!cmd->AllowUnregistered() && !u->Account())
if (!cmd->AllowUnregistered() && !u->IsIdentified())
return;
if (params.size() < cmd->min_params)
+1 -1
View File
@@ -68,7 +68,7 @@ class DNSBLResolver : public Request
if (!blacklist.replies.empty() && !reply)
return;
if (reply && reply->allow_account && user->Account())
if (reply && reply->allow_account && user->IsIdentified())
return;
Anope::string reason = this->blacklist.reason, addr = user->ip.addr();
+1 -1
View File
@@ -226,7 +226,7 @@ class MyXMLRPCEvent : public XMLRPCEvent
request.reply("ip", u->ip.addr());
request.reply("timestamp", stringify(u->timestamp));
request.reply("signon", stringify(u->signon));
if (u->Account())
if (u->IsIdentified())
{
request.reply("account", iface->Sanitize(u->Account()->display));
if (u->Account()->o)
+1 -1
View File
@@ -253,7 +253,7 @@ namespace InspIRCdExtban
{
const Anope::string &mask = e->GetMask();
Anope::string real_mask = mask.substr(2);
return !u->Account() && Entry("BAN", real_mask).Matches(u);
return !u->IsIdentified() && Entry("BAN", real_mask).Matches(u);
}
};
}
+1 -1
View File
@@ -699,7 +699,7 @@ namespace InspIRCdExtban
{
const Anope::string &mask = e->GetMask();
Anope::string real_mask = mask.substr(2);
return !u->Account() && Entry("BAN", real_mask).Matches(u);
return !u->IsIdentified() && Entry("BAN", real_mask).Matches(u);
}
};
+1 -1
View File
@@ -537,7 +537,7 @@ namespace UnrealExtban
const Anope::string &mask = e->GetMask();
Anope::string real_mask = mask.substr(3);
return u->Account() && Anope::Match(u->Account()->display, real_mask);
return u->IsIdentified() && Anope::Match(u->Account()->display, real_mask);
}
};
}
+2 -2
View File
@@ -559,10 +559,10 @@ namespace UnrealExtban
const Anope::string &mask = e->GetMask();
Anope::string real_mask = mask.substr(3);
if (real_mask == "0" && !u->Account()) /* ~a:0 is special and matches all unauthenticated users */
if (real_mask == "0" && !u->IsIdentified()) /* ~a:0 is special and matches all unauthenticated users */
return true;
return u->Account() && Anope::Match(u->Account()->display, real_mask);
return u->IsIdentified() && Anope::Match(u->Account()->display, real_mask);
}
};
+1 -1
View File
@@ -100,7 +100,7 @@ class MemoServCore : public Module, public MemoServService
if (ci->AccessFor(cu->user).HasPriv("MEMO"))
{
if (cu->user->Account() && cu->user->Account()->HasExt("MEMO_RECEIVE"))
if (cu->user->IsIdentified() && cu->user->Account()->HasExt("MEMO_RECEIVE"))
cu->user->SendMessage(MemoServ, MEMO_NEW_X_MEMO_ARRIVED, ci->name.c_str(), Config->StrictPrivmsg.c_str(), MemoServ->nick.c_str(), ci->name.c_str(), mi->memos->size());
}
}
+1 -1
View File
@@ -399,7 +399,7 @@ class NickServCore : public Module, public NickServService
const NickAlias *na = NickAlias::Find(u->nick);
const Anope::string &unregistered_notice = Config->GetModule(this)->Get<const Anope::string>("unregistered_notice");
if (!Config->GetModule("nickserv")->Get<bool>("nonicknameownership") && !unregistered_notice.empty() && !na && !u->Account())
if (!Config->GetModule("nickserv")->Get<bool>("nonicknameownership") && !unregistered_notice.empty() && !na && !u->IsIdentified())
u->SendMessage(NickServ, unregistered_notice.replace_all_cs("%n", u->nick));
else if (na && !u->IsIdentified(true))
this->Validate(u);
+1 -1
View File
@@ -62,7 +62,7 @@ const char *Language::Translate(const char *string)
const char *Language::Translate(User *u, const char *string)
{
if (u && u->Account())
if (u && u->IsIdentified())
return Translate(u->Account(), string);
else
return Translate("", string);
+1 -1
View File
@@ -114,7 +114,7 @@ void MemoInfo::Del(unsigned index)
bool MemoInfo::HasIgnore(User *u)
{
for (unsigned i = 0; i < this->ignores.size(); ++i)
if (u->nick.equals_ci(this->ignores[i]) || (u->Account() && u->Account()->display.equals_ci(this->ignores[i])) || Anope::Match(u->GetMask(), Anope::string(this->ignores[i])))
if (u->nick.equals_ci(this->ignores[i]) || (u->IsIdentified() && u->Account()->display.equals_ci(this->ignores[i])) || Anope::Match(u->GetMask(), Anope::string(this->ignores[i])))
return true;
return false;
}
+1 -1
View File
@@ -3,4 +3,4 @@
VERSION_MAJOR=2
VERSION_MINOR=0
VERSION_PATCH=17
VERSION_EXTRA="-git"
VERSION_EXTRA=""