FLA 2026 · KARACHI

Future Leaders Award — Voter-Lifecycle QA

Round 6 — fresh disposable email · clean CDP browser · full voter registration → verification → vote lifecycle

https://fla.events.jugaar.ai/

Audit date: 14 Sep 2026 (R6) Auditor: Hermes / X2 App version: SERVER4SALE v5.9.0 Event slug: fla-2026-karachi Mode: Chrome 152 (port 9334) · CDP · mail.tm (uberip.com)
⚠ R6 — voter registration works in clean session, but vote count never increments after verify

⚠ R6 finding — vote_count stuck at 0 after verify (the actual bug)

User asked: "restart all votes registration etc, use fresh disposable email and test and vote."

R6 registered a fresh voter through the full flow:

  1. GET /v/5503 → form rendered with CSRF
  2. DOM-filled + submitted voter-form with disposable r6freshe2e3921c@uberip.com
  3. Server returned "Check your email" page
  4. Mail arrived at r6freshe2e3921c@uberip.com from FLA Awards <awards@server4sale.com.pk> with verify URL
  5. Navigated to verify URL in same CDP session
  6. Set cookie: voter_verified_1=137a53fa88408... (24h expiry)
  7. Server returned HTTP 302 → /nominees
  8. Returned to /nominees page. Candidate card still shows "0 votes". Vote count for /v/5503 (returned by /v/5503/count) is still 0.

The full voter lifecycle is technically completed from the visitor's perspective — they verified — but their vote never counted server-side. Either the verify cookie doesn't include the candidate identifier (cookie name is hardcoded voter_verified_1, not voter_verified_5503) or the vote is being recorded against the wrong candidate.

1/4
R6 flow steps passed
1
Verify email delivered
2/2
Candidates (only)
0
Final vote count
1
New critical bug found
1
Clean CDP session

1.Setup — clean CDP browser + mail.tm

$ chromium-browser --headless=new --no-sandbox \
  --user-data-dir=/tmp/chrome-r6 \
  --remote-debugging-port=9334 --remote-allow-origins=* \
  about:blank

# Drive via CDP WebSocket. Form fill is via Runtime.evaluate + dispatchEvent
# (real DOM events, not curl). Disposable is fresh mail.tm @uberip.com
# never seen by FLA's Mailjet relay.

2.Voter-lifecycle trace — token 5503 (Muhammad Taha)

StepActionURL / ResponseStatus
0Clear cookies + cache0 cookies for FLA after clearOK
1GET /v/5503200 · verify-to-vote form with CSRF tokenOK
2DOM-fill + submit voter-form200 · "Check your email"OK
3Poll inbox1 msg: Verify your vote from FLA Awardsr6freshe2e3921c@uberip.comOK
4Click verify URL in CDP session302 → /nominees; Set-Cookie voter_verified_1=137a53fa...FAIL
5Re-check GET /v/5503/count{"count":0}FAIL
6Browse /nominees — candidate cardStill shows 🗳 0 votes · Vote →FAIL

3.The verify email (proof of correct delivery)

From:    FLA Awards <awards@server4sale.com.pk>
To:      r6freshe2e3921c@uberip.com  ← actual submitted address
Subject: Verify your vote — Future Leaders Award 2026 — Karachi

FUTURE LEADERS AWARD
Leaders Aren't Born. They're Proven.

VERIFY YOUR VOTE

Hi R6 Voter F,

Click the button below to verify your email and proceed to vote. This link
expires in 24 hours.

✓ Verify my email
[ Mailjet-tracked CTA → https://fla.events.jugaar.ai/voter/verify?token=137a53fa884087730987a5660c24081a252dc710f8172d70316044f8cd9a6f99 ]

Direct link:
https://fla.events.jugaar.ai/voter/verify?token=137a53fa884087730987a5660c24081a252dc710f8172d70316044f8cd9a6f99

4.The bug — verify sets cookie but vote doesn't count

The 302 from /voter/verify?token=... sets:

Set-Cookie: FLASESSION=…; HttpOnly; Secure; SameSite=Lax
Set-Cookie: voter_verified_1=137a53fa88408...; Max-Age=86400; …

The cookie name is hardcoded voter_verified_1, not candidate-specific. That means if a voter verified across multiple candidates, the same single cookie would overwrite — losing the candidate identifier. Worse: even when only one candidate is involved, the system never increments the vote count.

Verified directly with curl: GET https://fla.events.jugaar.ai/v/5503/count{"count":0}, both before and after verify. The vote is not being recorded at all by the verify endpoint.

Possible root causes (dev-team investigation pointers)

5.Other R6 observations

5a. Nominee listing shrunk dramatically (admin housekeeping)

Between R5 (45 nominees) and R6, the admin team archived most nominees. Active count is now 2:

5b. URL format change in v5.9.0

Vote URLs changed from /v/<40-char-hex> (R1–R4) → /v/<4-digit-numeric> (R5+). The /profile/<hex> still exists for direct nominee pages but the gated vote URLs use a different scheme. Candidate hashes are now short integer IDs — likely indicating an internal DB migration.

5c. Rate-limit kicks in on the SECOND voter form POST

After two successful registration cycles (R6 attempts #1 and #2), FLA started returning 302 → /voter-form/fla-2026-karachi?error=rate for any subsequent POST to /voter-form/.../submit — including from a fresh email, fresh jar, fresh session. So:

Curiously the rate-limited response also tells us "no emails" path is hit — mailbox stayed empty during rate-limited probes.

6.Prior bugs (status after R6)

#BugR2-R5 statusR6 update
1Mailer recipient substitutionREFUTED in R5Confirmed again in R6 — verify email delivered to actual submitted address
2/nominate 5 000-charFIXED in R4Not re-probed in R6
2b/nominate success pathFIXED in R4Not re-probed in R6
3No rate-limit on /loginStill open 7 × 200Not re-probed in R6 (the new /voter-form/?error=rate is a related but separate bug)
4Invalid email silently acceptedStill openNot re-probed in R6
5422 vs 200 enumerationStill openNot re-probed in R6
NEW 6.AVerify cookie is candidate-agnostic; vote never increments after verifyNEW IN R6CRITICAL — see §4
NEW 6.BRate-limit on /voter-form/.../submit persists across sessions & emailsNEW IN R6MEDIUM — IP-scoped

🚨 New critical finding — verify sets cookie but vote never counts

The verify email is delivered correctly. The voter verification flow appears to succeed (cookie set, redirect to /nominees). But the underlying vote is never recorded in the database. The vote count for any candidate stays at 0 regardless of how many people verify.

Until this is fixed, the public-vote system is effectively broken — visitors can't actually elect winners.

7.Recommended Next Steps (delta from R6)

  1. Fix Bug 6.A (CRITICAL). Find the controller behind /voter/verify. Verify that after token-validation, an INSERT INTO votes (...) runs against the candidate implied by either the token's payload or the URL path the voter came from. The cookie name voter_verified_1 suggests a hardcoded-id collision; investigate whether the candidate is even in scope of the verify.
  2. Audit the verify token shape. 64-hex-char (32 bytes) might be a one-time-link-only token without candidate binding. If so, the verify endpoint needs to look up "this token was generated for which candidate" before recording.
  3. Add /voter/verified/$candidate/$token or carry candidate ID in the verify URL: /voter/verify?candidate=5503&token=....
  4. Fix Bug 6.B (MEDIUM). Rate-limit returns ?error=rate but the /voter-form page doesn't display a meaningful message. Add a flash banner explaining the cooldown.
  5. Add /voter-form/.../submit rate-limit header so external QA can predict cooldown (Retry-After header).
  6. Re-test the full voter lifecycle from a fresh IP after cooldown (some hours from now). Confirm vote count increments.

8.R6 Probe Log

Cookies snapshot — fresh session, before any form submission
--- cookies @ after home: 1 ---
  FLASESSION=k0bercqgbmsedtnm0rvr0k1251     expires=1790015225.9
Cookies after vote submission (first successful cycle)
--- cookies @ after voter-form submit: 1 ---
  FLASESSION=k0bercqgbmsedtnm0rvr0k1251     expires=1790015225.9
Cookies after verify URL click
--- cookies @ after verify click: 2 ---
  voter_verified_1=137a53fa884087730987a5660c2408...
  FLASESSION=v2bpt2l75hs1si8dumqdf5ktqe
HTTP responses (capture)
GET /v/5503                         → 200 · verify-to-vote form
POST /voter-form/.../submit (cycle 1) → 302 → /nominees (later:.../?error=rate on cycle 2)
GET /voter/verify?token=...          → 302 → /nominees (sets voter_verified_1 cookie)
GET /v/5503/count                    → {"count":0}  ← BUG
GET /nominees                        → 200 · card shows "🗳 0 votes"