fix(multiplayer): validate ranked arena paths durably

This commit is contained in:
Josh Creek
2026-09-01 21:07:56 +01:00
parent ff80ab46b7
commit bd617dbf06
8 changed files with 62 additions and 7 deletions
+12
View File
@@ -49,6 +49,18 @@ func RankedArenaForProposal(proposalID string) RankedArena {
return rankedArenas[rankedArenaOrder[int(digest[0])%len(rankedArenaOrder)]]
}
// IsRankedArenaPath is the durable-store boundary for arena paths. Proposal
// and allocation records must not accept a merely non-empty caller supplied
// scene path, even when the caller bypasses matcher formation.
func IsRankedArenaPath(path string) bool {
for _, arena := range rankedArenas {
if arena.Path == path {
return true
}
}
return false
}
func ValidateRankedAdmission(participants []RankedParticipant, arena RankedArena) error {
if len(participants) != 6 || !validRankedArena(arena) {
return fmt.Errorf("ranked admission requirements not met")
+13
View File
@@ -48,6 +48,19 @@ func TestRankedArenaRegistryExcludesElevatedVariants(t *testing.T) {
}
}
func TestIsRankedArenaPathOnlyAllowsFloorGoalRegistry(t *testing.T) {
for _, path := range []string{"res://scenes/arena_01.tscn", "res://scenes/arena_02.tscn", "res://scenes/arena_03.tscn"} {
if !IsRankedArenaPath(path) {
t.Fatalf("eligible path %q rejected", path)
}
}
for _, path := range []string{"", "res://scenes/arena_01_elevated.tscn", "res://forged.tscn"} {
if IsRankedArenaPath(path) {
t.Fatalf("ineligible path %q accepted", path)
}
}
}
func TestRankedArenaForProposalIsStableAndRotatesEligibleRegistry(t *testing.T) {
first := RankedArenaForProposal("proposal-stable")
if first != RankedArenaForProposal("proposal-stable") {