diff options
author | Adam <Adam@anope.org> | 2014-05-14 19:10:23 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2014-05-14 19:10:23 -0400 |
commit | df321a118e7dd44dcd3a389f8ee75e9ff915b55e (patch) | |
tree | f77aa4b3a73884c4a095df12be692292c8694bc0 /src/access.cpp | |
parent | 1931fcf0e5ffe34005d134e49c55d1b6239d1a6c (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/access.cpp')
-rw-r--r-- | src/access.cpp | 53 |
1 files changed, 49 insertions, 4 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; |