CIA/e-voting-system/VOTING_SETUP_ISSUE.md
Alexis Bruneteau 5652ff2c8a docs: Add voting setup troubleshooting guide
Documents the issue where elections are missing ElGamal encryption parameters
which are required for the voting system to work. Provides 3 options to fix:
1. Database SQL update
2. Adminer UI
3. Fresh database reset

Explains root cause and how to verify the fix worked.
2025-11-07 03:15:02 +01:00

3.2 KiB

Voting Setup Issue - Solution

Problem

Users cannot vote because:

  1. Elections don't have ElGamal encryption keys (elgamal_p, elgamal_g)
  2. The voting interface fails when trying to get public keys

Root Cause

The database initialization script docker/create_active_election.sql didn't set the ElGamal parameters, even though the init.sql had elgamal_p = 23, elgamal_g = 5.

Fix

Connect to the database and update the elections with ElGamal parameters:

# Connect to MariaDB
docker compose exec mariadb mariadb -u evoting_user -pevoting_pass123 evoting_db

# Run this SQL:
UPDATE elections SET elgamal_p = 23, elgamal_g = 5;

# Verify:
SELECT id, name, elgamal_p, elgamal_g FROM elections LIMIT 5;

# Exit
exit

Option 2: Use Adminer UI

  1. Go to http://localhost:8081
  2. Login:
    • Server: mariadb
    • User: evoting_user
    • Password: evoting_pass123
    • Database: evoting_db
  3. Click on elections table
  4. Edit each row and set:
    • elgamal_p = 23
    • elgamal_g = 5

Option 3: Fresh Database Reset

# Stop and remove all data
docker compose down -v

# Start fresh
docker compose -f docker-compose.multinode.yml up -d

# Wait 40 seconds for initialization
sleep 40

# Verify elections have keys
curl http://localhost:8000/api/elections/debug/all | jq '.elections[0] | {id, name, elgamal_p, elgamal_g}'

Verify Fix Worked

After fixing, test:

# Check election keys are set
curl http://localhost:8000/api/elections/debug/all | jq '.elections[0] | {id, name, elgamal_p, elgamal_g}'

# Should show:
# {
#   "id": 1,
#   "name": "...",
#   "elgamal_p": 23,
#   "elgamal_g": 5
# }

# Get public keys (should work now)
curl http://localhost:8000/api/votes/public-keys?election_id=1 | jq '.'

Why This Happened

The SQL scripts do this:

  1. docker/init.sql - Creates elections with elgamal_p = 23, elgamal_g = 5
  2. docker/populate_past_elections.sql - Inserts past elections (no ElGamal params)
  3. docker/create_active_election.sql - Updates election 1 but lost the ElGamal params

The UPDATE statement in step 3 didn't preserve the ElGamal parameters. They should be:

UPDATE elections
SET
    is_active = TRUE,
    start_date = DATE_SUB(NOW(), INTERVAL 1 HOUR),
    end_date = DATE_ADD(NOW(), INTERVAL 7 DAY),
    elgamal_p = 23,
    elgamal_g = 5
WHERE id = 1;

After Fix

Once elections have ElGamal keys:

  1. Users can register normally
  2. Users can see active elections
  3. Frontend can fetch public keys for voting
  4. Encrypted voting works
  5. Blockchain records votes

Testing After Fix

# 1. Check keys are set
curl http://localhost:8000/api/votes/public-keys?election_id=1

# 2. Open frontend
http://localhost:3000

# 3. Register (if needed)
# 4. Login
# 5. Click "Participer" on an election
# 6. Select a candidate
# 7. Submit vote

# Should see success message with transaction ID

If Still Not Working

  1. Clear browser cache (Ctrl+Shift+Delete)
  2. Restart frontend container: docker compose restart frontend
  3. Rebuild frontend if config changed: docker compose up -d --build frontend
  4. Check backend logs: docker compose logs backend | grep -i error
  5. Check browser console for errors (F12)