Bagnon explicitly taints many bag-related functions
rowaasr13 opened this issue ยท 3 comments
:StopIf method used by :HookBaseUI explicitly overwrites many bags and bank related functions. It's a gross breach of secure code, as they're called in many places in Blizzard's addons and continue to spread taint all over.
For example all anima deposit bugs (#1602, #1593, #1357, #1347) are directly related to this, and likely many other taint bugs as well.
Commenting hook out like
-- domain[name] = function(...)
-- if not hook(...) then
-- return original(...)
-- end
-- end
makes deposit work once again.
Please NEVER EVER overwrite Blizzard functions - you're guaranteed to spread taint this way. Use hooksecurefunc
to post-hook and undo whatever Blizzard function did instead. So for example for OpenAllBags
let it run its course and then hide Blizzard frames and open your own in post-hook, etc.
In this particular case the the culprit is overwriting of PlayerInteractionFrameManager.ShowFrame
. It gets called with type 51 when Covenant frame is displayed and taints creation of everything including deposit button. Replacing it with post-hook like this one fixes deposting (note two TODOs):
hooksecurefunc(PlayerInteractionFrameManager, 'ShowFrame', function(manager, type)
if type == Interactions.Banker then
if BankFrame then CloseBankFrame() end
Addon.Frames:Show('bank')
elseif type == Interactions.GuildBanker then
-- TODO: hide blizzard
Addon.Frames:Show('guild')
elseif type == Interactions.VoidStorageBanker then
-- TODO: hide blizzard
Addon.Frames:Show('vault')
end
end)
Awesome rundown of the issue! Since my last post mentioned by OP i've had taint issues every now and then, cant click items from bag, cant click items from quests in the questpane and others.
Hope dev finally takes a hard look at this specially with this splendid breakdown of what's causing them.
I've added function to neutralize I events/hook I could remember on Blizzard frames so final change is like this:
local function NeutralizeFrame(frame)
if not frame then return end
frame:UnregisterAllEvents()
frame:SetScript("OnEvent", nil)
frame:SetScript("OnShow", nil)
frame:SetScript("OnHide", nil)
HideUIPanel(frame)
frame:ClearAllPoints()
frame:Hide()
end
hooksecurefunc(PlayerInteractionFrameManager, 'ShowFrame', function(manager, type)
if type == Interactions.Banker then
NeutralizeFrame(BankFrame)
NeutralizeFrame(ReagentBankFrame)
Addon.Frames:Show('bank')
elseif type == Interactions.GuildBanker then
Addon.Frames:Show('guild')
elseif type == Interactions.VoidStorageBanker then
Addon.Frames:Show('vault')
end
end)