File Details
SpeakinSpell Reeee 2.0.7.zip
- R
- Apr 27, 2026
- 704.54 KB
- 23
- 12.0.5+2
- Retail
File Name
SpeakinSpell Reeee 2.0.7.zip
Supported Versions
- 12.0.5
- 12.0.1
- 12.0.0
Complete: 2.0.7 Kutjara.Wiya.Tiapanpa
Concern grouping:
[OPS]= structure & organisation ·[BACKEND]=speech.lua,wowevents.lua,data.lua,utils.lua,network.lua,spellbookManager.lua,SpeakinSpell.lua,loader.lua·[GUI]=SpeakinSpell_GUI/module ·[CONTENT]= locale strings, default speeches, i18n ·[DEFAULTS]=SpeakinSpell_Defaults/module ·[PATCH]=SpeakinSpell_Patches/module
[BACKEND] Aura Detection Framework Rewrite
-- The previous CLEU-based aura detection approach was deprecated for this use case. A new framework was written to detect player auras via UNIT_AURA directly in loader.lua, supplementing CLEU which is suppressed inside instances.
[x]TODO(02_high-backend-refactor-proficient+lua+wow): Replace deprecatedCOMBAT_LOG_EVENT_UNFILTEREDaura detection with aUNIT_AURAframework inloader.lua. Implement full-update (isFullUpdate) and incremental (addedAuras/removedAuraInstanceIDs) paths withPlayerAuraCacheas the backing store.[x]TODO(02_high-backend-bug-proficient+lua+wow): GateCLEUFrameinitialisation withSpeakinSpell.PlayerInCombat = falseandSpeakinSpell.PlayerAuraCache = SpeakinSpell.PlayerAuraCache or {}beforeSetScriptregistration to prevent uninitialised state on first event.[x]TODO(02_high-backend-bug-proficient+lua+wow): Add post-combat delay toPlayerInCombatflag clear.PLAYER_REGEN_ENABLEDfires before the server finishes resolving obfuscation; defer flag clear by one tick viaC_Timer.After(0, ...)to give the API time to settle.[ ]TODO(03_medium-backend-refactor-routine+lua+wow): MigrateCLEUFrameevent registration fromloader.luatowowevents.luato consolidate event registration in the correct module. Currently blocked by an undiagnosed break that occurs when the call is moved.
Status: Aura detection framework complete and tested. CLEU migration deferred pending investigation of break-on-move.
[BACKEND] Secret String Hardening — pcall Sanitisation Deprecation
-- Empirical testing confirmed that pcall does not intercept secret string taints. Secret strings pass through pcall silently and only throw when actually used (compared, concatenated, passed to tostring). The GetSafeString / GetSafeUnitName pattern has been removed throughout and replaced with flag-based gating.
[x]TODO(01_critical-security-bug-proficient+lua+wow): RemoveGetSafeStringandGetSafeUnitNamepcall wrappers fromloader.lua. These helpers provide false confidence — secret strings pass through pcall silently and remain tainted. Replace all usage sites with thePlayerInCombat or IsInInstance()flag gate.[x]TODO(01_critical-security-bug-proficient+lua+wow): RemoveGetSafeString(spellInfo.name)fromCacheAurasandaddedAurasblocks inloader.lua.C_Spell.GetSpellInforeads from the client spell database and is not server-sourced; its return value is constitutionally safe. UsespellInfo.namedirectly after aC_Spell.GetSpellInfocall with no further sanitisation.[x]TODO(01_critical-security-bug-proficient+lua+wow): RemovesourceUnitfrom thePlayerAuraCacheentry structure. It was only ever populated viaGetSafeString(aura.sourceUnit), which is now confirmed ineffective, and no downstream path uses the cached value.
Status: Complete. pcall sanitisation pattern fully removed and replaced with flag gating throughout.
[BACKEND] Secret String Hardening — Instance and Combat Gating
-- UnitName and related unit-query API calls return secret (obfuscated) strings inside instances regardless of combat state. The existing PlayerInCombat flag was insufficient alone; all affected sites now gate on PlayerInCombat or IsInInstance(). IsInInstance() is a pure client-side call with no taint risk.
[x]TODO(01_critical-security-bug-proficient+lua+wow): GateGetDefaultTarget(data.lua) onPlayerInCombat or IsInInstance(). This is the root call site for allUnitName("target"),UnitName("focus"), andUnitName("mouseover")fallback queries; gating here covers all callers regardless of trigger path.[x]TODO(01_critical-security-bug-proficient+lua+wow): GateUnitName("target")inOnSlashCommand(slashcommands.lua) onPlayerInCombat or IsInInstance()before assignment tode.target. This was the entry point for the initial reported crash — macro with targeting substitution fired from action bar during combat in an instance.[x]TODO(01_critical-security-bug-proficient+lua+wow): GateParentDetectedEvent.targetinheritance inProcessRecursiveUserMacro(slashcommands.lua) onPlayerInCombat or IsInInstance(). Even withOnSlashCommandpatched, the parent event's firstCreateDetectedEventpass may have already written a tainted value viaGetDefaultTarget; inheritance must be gated separately to prevent propagation into the recursive call.[x]TODO(01_critical-security-bug-proficient+lua+wow): GateSearchOrder[3](substitutions.lua) onPlayerInCombat or IsInInstance(). This is the genericUnitName(sk.key)fallback covering all unit-ID substitution tokens:<party1–5>,<raid1–40>,<arena1–5>,<partypet1–5>,<mouseover>,<focus>,<pet>,<playertarget>,<playertargettarget>, and hyphenated name-target chains.[x]TODO(01_critical-security-bug-proficient+lua+wow): GateSubstitutionFunctions["selected"](substitutions.lua) onPlayerInCombat or IsInInstance(). DirectUnitName("target")call; same vulnerability class as the original crash.[x]TODO(02_high-security-bug-proficient+lua+wow): GateNameToUnitID(utils.lua) onPlayerInCombat or IsInInstance(). Function iterates the fullNameToUnitIDSearchListcallingUnitNameon every entry; used bytargetclass,targetrace, andSubstituteGender. All callers handle nil gracefully.[x]TODO(02_high-security-bug-proficient+lua+wow): GateUnitName(de.target)NPC detection check intargetclass(substitutions.lua) onPlayerInCombat or IsInInstance(). If unsafe, skip the NPC check and return the class directly; a missed NPC tag is a cosmetic loss rather than a taint error.[x]TODO(02_high-security-bug-proficient+lua+wow): GateSubstituteGender(substitutions.lua) unit sex query block onPlayerInCombat or IsInInstance().UnitSexreturns an integer and cannot produce a secret string, but passing a tainted argument to any API call in a restricted frame propagates taint to subsequent calls. Returnfalse(unknown gender) to let the caller use the ungendered fallback form.[x]TODO(01_critical-security-bug-proficient+lua+wow): GateCacheAurasfull-update path (loader.lua) onPlayerInCombat or IsInInstance(). Full update fires on zone entry including entering instances; the cache must be cleared on full update but repopulation must be deferred until outside a restricted context.
Status: Complete. All identified UnitName and unit-query call sites gated. IsInInstance() confirmed to cover the out-of-combat-but-instanced case that PlayerInCombat alone misses.
[BACKEND] Secret String Hardening — Player Name Cache
-- UnitName("player") is safe at login but calling it during tainted execution frames can propagate taint to subsequent API calls in the same tick even if the return value itself is clean. Cached at login and used throughout in place of live calls.
[x]TODO(02_high-security-refactor-competent+lua+wow): CacheUnitName("player")at login toSpeakinSpell.RuntimeData.PlayerName. Replace allUnitName("player")calls inwowevents.luaandloader.luastub targets withSpeakinSpell.RuntimeData.PlayerName or UnitName("player"). Theorfallback covers the narrow pre-load window beforeOnVariablesLoadedcompletes, at which point no restricted context exists.[x]TODO(02_high-security-refactor-competent+lua+wow): ReplaceSubstitutionFunctions["caster"](substitutions.lua) liveUnitName("player")call withSpeakinSpell.RuntimeData.PlayerNamecache lookup.
Status: Complete. All UnitName("player") call sites in event stubs replaced.
[GUI] ChannelTable — Nil Guard on Channel Select
-- ChannelTable is built during OnVariablesLoaded. If the GUI fires a channel selection event before that completes, CurrentMessagesGUI_OnChannelSelect would attempt to index a nil table.
[x]TODO(02_high-gui-bug-competent+lua+wow): Add lazy-init nil guard toCurrentMessagesGUI_OnChannelSelect(currentmessages.lua) beforeself.ChannelTableis indexed. IfChannelTableis nil, callCreateChannelTable()immediately as a fallback rather than moving or duplicating the deferred initialisation, since the deferral inOnVariablesLoadedis intentional.
Status: Complete.
[BUG] Minimap Icon — Missing (Unresolved — Carried to 2.0.8)
-- The minimap icon ceased rendering during this cycle. Cause has not been identified; no correlation with any specific patch has been established.
[ ]TODO(02_high-ui-bug-competent+lua+wow): Investigate missing minimap icon. Confirmminimapbutton.luaregistration is completing correctly and thatLibDBIcon-1.0is receiving the broker object. Check whether theloader.luaframework changes affected load order or frame creation timing. Failing that, assess need for exorcism.
Status: Unresolved. Carried forward to 2.0.8.

