summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2014-05-14 19:10:23 -0400
committerAdam <Adam@anope.org>2014-05-14 19:10:23 -0400
commitdf321a118e7dd44dcd3a389f8ee75e9ff915b55e (patch)
treef77aa4b3a73884c4a095df12be692292c8694bc0 /src
parent1931fcf0e5ffe34005d134e49c55d1b6239d1a6c (diff)
Fix access lists showing the wrong mask if the display nick for a group
expires but the group still exists. This can cause access entries for nicks to not be deleted whenever the nicks are deleted.
Diffstat (limited to 'src')
-rw-r--r--src/access.cpp53
-rw-r--r--src/regchannel.cpp16
2 files changed, 50 insertions, 19 deletions
diff --git a/src/access.cpp b/src/access.cpp
index 1b90bb59f..74ff018b9 100644
--- a/src/access.cpp
+++ b/src/access.cpp
@@ -151,9 +151,8 @@ ChanAccess::~ChanAccess()
if (it != this->ci->access->end())
this->ci->access->erase(it);
- const NickAlias *na = NickAlias::Find(this->mask);
- if (na != NULL)
- na->nc->RemoveChannelReference(this->ci);
+ if (nc != NULL)
+ nc->RemoveChannelReference(this->ci);
else
{
ChannelInfo *c = ChannelInfo::Find(this->mask);
@@ -163,6 +162,50 @@ ChanAccess::~ChanAccess()
}
}
+void ChanAccess::SetMask(const Anope::string &m, ChannelInfo *c)
+{
+ if (nc != NULL)
+ nc->RemoveChannelReference(this->ci);
+ else if (!this->mask.empty())
+ {
+ ChannelInfo *targc = ChannelInfo::Find(this->mask);
+ if (targc)
+ targc->RemoveChannelReference(this->ci->name);
+ }
+
+ ci = c;
+ mask.clear();
+ nc = NULL;
+
+ const NickAlias *na = NickAlias::Find(m);
+ if (na != NULL)
+ {
+ nc = na->nc;
+ nc->AddChannelReference(ci);
+ }
+ else
+ {
+ mask = m;
+
+ ChannelInfo *targci = ChannelInfo::Find(mask);
+ if (targci != NULL)
+ targci->AddChannelReference(ci->name);
+ }
+}
+
+const Anope::string &ChanAccess::Mask() const
+{
+ if (nc)
+ return nc->display;
+ else
+ return mask;
+}
+
+NickCore *ChanAccess::GetAccount() const
+{
+ return nc;
+}
+
void ChanAccess::Serialize(Serialize::Data &data) const
{
data["provider"] << this->provider->name;
@@ -192,7 +235,9 @@ Serializable* ChanAccess::Unserialize(Serializable *obj, Serialize::Data &data)
else
access = aprovider->Create();
access->ci = ci;
- data["mask"] >> access->mask;
+ Anope::string m;
+ data["mask"] >> m;
+ access->SetMask(m, ci);
data["creator"] >> access->creator;
data["last_seen"] >> access->last_seen;
data["created"] >> access->created;
diff --git a/src/regchannel.cpp b/src/regchannel.cpp
index 0228196a0..7e0ce300c 100644
--- a/src/regchannel.cpp
+++ b/src/regchannel.cpp
@@ -143,8 +143,7 @@ ChannelInfo::ChannelInfo(const ChannelInfo &ci) : Serializable("ChannelInfo"),
AccessProvider *provider = taccess->provider;
ChanAccess *newaccess = provider->Create();
- newaccess->ci = this;
- newaccess->mask = taccess->mask;
+ newaccess->SetMask(taccess->Mask(), this);
newaccess->creator = taccess->creator;
newaccess->last_seen = taccess->last_seen;
newaccess->created = taccess->created;
@@ -399,19 +398,6 @@ BotInfo *ChannelInfo::WhoSends() const
void ChannelInfo::AddAccess(ChanAccess *taccess)
{
this->access->push_back(taccess);
-
- const NickAlias *na = NickAlias::Find(taccess->mask);
- if (na != NULL)
- {
- na->nc->AddChannelReference(this);
- taccess->nc = na->nc;
- }
- else
- {
- ChannelInfo *ci = ChannelInfo::Find(taccess->mask);
- if (ci != NULL)
- ci->AddChannelReference(this->name);
- }
}
ChanAccess *ChannelInfo::GetAccess(unsigned index) const