From a52af0d2600e06b5fad7e6b3e313698dd262423e Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Tue, 4 Nov 2014 23:56:27 +0100 Subject: [PATCH 1/4] InspIRCd 2.0: Add METADATA handler, pass everything to inspircd12/metadata --- modules/protocol/inspircd20.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index eb711e099..d9992250e 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -847,6 +847,20 @@ struct IRCDMessageSave : IRCDMessage } }; +class IRCDMessageMetadata : IRCDMessage +{ + ServiceReference insp12_metadata; + + public: + IRCDMessageMetadata(Module *creator) : IRCDMessage(creator, "METADATA", 3), insp12_metadata("IRCDMessage", "inspircd12/metadata") { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } + + void Run(MessageSource &source, const std::vector ¶ms) anope_override + { + if (insp12_metadata) + insp12_metadata->Run(source, params); + } +}; + class ProtoInspIRCd20 : public Module { Module *m_insp12; @@ -871,7 +885,7 @@ class ProtoInspIRCd20 : public Module /* InspIRCd 1.2 message handlers */ ServiceAlias message_endburst, message_fjoin, message_fmode, - message_ftopic, message_idle, message_metadata, message_mode, + message_ftopic, message_idle, message_mode, message_nick, message_opertype, message_rsquit, message_server, message_squit, message_time, message_uid; @@ -880,6 +894,7 @@ class ProtoInspIRCd20 : public Module IRCDMessageEncap message_encap; IRCDMessageFHost message_fhost; IRCDMessageFIdent message_fident; + IRCDMessageMetadata message_metadata; IRCDMessageSave message_save; bool use_server_side_topiclock, use_server_side_mlock; @@ -901,7 +916,6 @@ class ProtoInspIRCd20 : public Module message_fmode("IRCDMessage", "inspircd20/fmode", "inspircd12/fmode"), message_ftopic("IRCDMessage", "inspircd20/ftopic", "inspircd12/ftopic"), message_idle("IRCDMessage", "inspircd20/idle", "inspircd12/idle"), - message_metadata("IRCDMessage", "inspircd20/metadata", "inspircd12/metadata"), message_mode("IRCDMessage", "inspircd20/mode", "inspircd12/mode"), message_nick("IRCDMessage", "inspircd20/nick", "inspircd12/nick"), message_opertype("IRCDMessage", "inspircd20/opertype", "inspircd12/opertype"), @@ -911,7 +925,8 @@ class ProtoInspIRCd20 : public Module message_time("IRCDMessage", "inspircd20/time", "inspircd12/time"), message_uid("IRCDMessage", "inspircd20/uid", "inspircd12/uid"), - message_capab(this), message_encap(this), message_fhost(this), message_fident(this), message_save(this) + message_capab(this), message_encap(this), message_fhost(this), message_fident(this), message_metadata(this), + message_save(this) { if (ModuleManager::LoadModule("inspircd12", User::Find(creator)) != MOD_ERR_OK) From 72ade225a7ec3bc80250cb7ec0454e73c10a1f5a Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Wed, 5 Nov 2014 00:02:39 +0100 Subject: [PATCH 2/4] InspIRCd 2.0: Pass use_server_side_topiclock and use_server_side_mlock references to METADATA handler --- modules/protocol/inspircd20.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index d9992250e..6f52c6006 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -850,9 +850,11 @@ struct IRCDMessageSave : IRCDMessage class IRCDMessageMetadata : IRCDMessage { ServiceReference insp12_metadata; + const bool &do_topiclock; + const bool &do_mlock; public: - IRCDMessageMetadata(Module *creator) : IRCDMessage(creator, "METADATA", 3), insp12_metadata("IRCDMessage", "inspircd12/metadata") { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } + IRCDMessageMetadata(Module *creator, const bool &handle_topiclock, const bool &handle_mlock) : IRCDMessage(creator, "METADATA", 3), insp12_metadata("IRCDMessage", "inspircd12/metadata"), do_topiclock(handle_topiclock), do_mlock(handle_mlock) { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } void Run(MessageSource &source, const std::vector ¶ms) anope_override { @@ -925,7 +927,7 @@ class ProtoInspIRCd20 : public Module message_time("IRCDMessage", "inspircd20/time", "inspircd12/time"), message_uid("IRCDMessage", "inspircd20/uid", "inspircd12/uid"), - message_capab(this), message_encap(this), message_fhost(this), message_fident(this), message_metadata(this), + message_capab(this), message_encap(this), message_fhost(this), message_fident(this), message_metadata(this, use_server_side_topiclock, use_server_side_mlock), message_save(this) { From e47aacad0ec416069be66b23d5ae8935e708a1bb Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Wed, 5 Nov 2014 00:10:01 +0100 Subject: [PATCH 3/4] InspIRCd 2.0: Re-set server-side mlock when an incoming METADATA mlock from a bursting server changes it --- modules/protocol/inspircd20.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index 6f52c6006..5b0c6e847 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -858,6 +858,26 @@ class IRCDMessageMetadata : IRCDMessage void Run(MessageSource &source, const std::vector ¶ms) anope_override { + // We deliberately ignore non-bursting servers to avoid pseudoserver fights + if ((params[0][0] == '#') && (!source.GetServer()->IsSynced())) + { + Channel *c = Channel::Find(params[0]); + if (c && c->ci) + { + if ((do_mlock) && (params[1] == "mlock")) + { + ModeLocks *modelocks = c->ci->GetExt("modelocks"); + Anope::string modes; + if (modelocks) + modes = modelocks->GetMLockAsString(false).replace_all_cs("+", "").replace_all_cs("-", ""); + + // Mode lock string is not what we say it is? + if (modes != params[2]) + UplinkSocket::Message(Me) << "METADATA " << c->name << " mlock :" << modes; + } + } + } + if (insp12_metadata) insp12_metadata->Run(source, params); } From 89257d9bcef1c4dfa9f66d3d5cdca31eded74f47 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Wed, 5 Nov 2014 00:13:29 +0100 Subject: [PATCH 4/4] InspIRCd 2.0: Re-set server-side topiclock when an incoming METADATA topiclock from a bursting server changes it --- modules/protocol/inspircd20.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index 5b0c6e847..9130c4354 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -875,6 +875,13 @@ class IRCDMessageMetadata : IRCDMessage if (modes != params[2]) UplinkSocket::Message(Me) << "METADATA " << c->name << " mlock :" << modes; } + else if ((do_topiclock) && (params[1] == "topiclock")) + { + bool mystate = c->ci->GetExt("TOPICLOCK"); + bool serverstate = (params[2] == "1"); + if (mystate != serverstate) + UplinkSocket::Message(Me) << "METADATA " << c->name << " topiclock :" << (mystate ? "1" : ""); + } } }