Wikipedista:Beren/CsArbComVote

Na wikipedii je zřetelný zájem o tajné volby do zdejšího arbitrážního výboru a byl jsem tedy požádán, abych provedl přípravu software pro tento účel.

Motivace

editovat

Pravidla sice tajnou volbu nevyžadují, existuje však několik důvodů, proč hlasovat tímto způsobem a nikoliv veřejně:

  • zabránit možné podjatosti budoucích členů výboru vůči těm, kteří pro ně nehlasovali;
  • omezit možnost zákulisního ovlivňování voličů, zabránit efektu "stádního" hlasování a uplatňování hlasovacích strategií;
  • způsob hlasování může posílit vnější autoritu výboru.

Princip činnosti

editovat

Nad volbami bdí administrátoři voleb. Administrátor voleb vidí, kdo v průběhu voleb hlasoval, jaké měl IP a hlavičku HTTP_USER_AGENT. Problematické hlasy může škrtnout. Administrátor voleb má k dispozici tajný klíč, takže může dekódovat výsledné hlasy z logu (které jsou očištěny od možnosti identifikace).

Funkcionalita tohoto software:

  • Na hlasovací stránce jsou zobrazeni všichni kandidáti a k nim ve formuláři možnosti hlasování. U každého kandidáta je možné zaškrtnout jednu možnost, implicitní je možnost "nehlasuji".
  • Po odeslání se z formuláře vytvoří záznam typu:
Hlasoval jsem pro: kandidát1, kandidát2
Hlasoval jsem proti: kandidát4
Zdržel jsem se: kandidát5
  • Tento záznam je zakódován veřejným klíčem a podepsán tajným.
  • Záznamy o uživatelích jsou uchovávány na stránce se seznamem hlasů, jsou uspořádány podle abecedy a běžný uživatel zde uvidí tabulku se jménem hlasujícího, časem a počtem jeho editací. Administrátor voleb zde vidí navíc IP a hlavičku HTTP_USER_AGENT jednotlivých hlasujících.
  • V celkovém záznamu voleb jsou zaznamenány všechny zakódované hlasy (v jiném pořadí než záznamy o uživatelích). Jen administrátor voleb s tajným klíčem je může rozkódovat. Rozkódování je realizováno nástrojem tally.php, který vrací seznam kandidátů a u každého počet hlasů pro/proti/zdrželo se. Nástroj se použije na účtu s naimportovaným stejným tajným a veřejným klíčem (nebo přímo na serveru) zavoláním:
php tally.php zaznam_voleb.txt

Úprava software

editovat

Původní software sloužící k hlasování do rady nadace Wikimedia jsem upravil v následujících směrech:

  • Přejmenoval jsem některé části tak, aby software pro volbu do rady mohl případně fungovat paralalně vedle stránek pro volbu českého arbitrážního výboru.
  • Upravil jsem stránku pro hlasování, aby umožnila nikoliv jen hlasy ano/nehlasuji jako v hlasování do rady, ale ano/ne/zdržel jsem se/nehlasuji. Ve stejném smyslu jsem upravil metodu pro zakódování hlasů a nástroj pro spočítání výsledků (tally.php).
  • Upravil jsem počítání editací, aby se nepočítal celkový počet editací v projektu, ale jen počet editací v článcích.
  • Odblokována funkcionalita pro uzavření voleb (od verze 1.2)
  • Pořadí v dumpu (záznamu) voleb je skutečně náhodné (od verze 1.2)
  • Dump se generuje až po dokončení voleb (od verze 1.2)
  • Volební lístky jsou před zašifrováním osoleny, takže stejné hlasování nedává naprosto stejné zašifrované záznamy (od verze 1.2).
  • K hlasovacím lístkům se při zašifrování nepřidává aktuální čas, takže z něj nelze určit, čí jsou. Hlasy podepsané serverem se ukazují jen při hlasování uživatelům. (funkční od verze 1.4)
  • Veřejné klíče na zvláštní stránce (od verze 1.4)
  • Odebráno zbytečné solení hlasů (každý hlas se stejně šifruje náhodným symetrickým klíčem, hlasy jsou tudíž různé samy od sebe). (od verze 1.5)

Upravenou poslední verzi 1.5 tohoto software lze stáhnout a vyzkoušet.
Dostupné verze: Verze 1.1 1.2 1.3 1.4 1.5

Instalační postup

editovat

Tento instalační postup předpokládá, že uživatel už má pod operačním systémem Linux nainstalované všechny věci pro zdárný běh MediaWiki (Apache, PHP, MySQL) a zbývá mu jen rozběhat rozšíření umožňující tajné volby do arbitrážního výboru. Toto rozšíření vyžaduje mít nainstalovaný software GNU PG, který zajistí zakódování jednotlivých hlasů. Je potřeba provést následující kroky:

  • vložit do extensions adresáře Mediawiki adresář CsArbComVote tohoto rozšíření (tedy rozzipovat rozšírení do adresáře extensions)
  • na konci souboru LocalSettings.php (ale před ukončení PHP tagu) vložit:
include("extensions/CsArbComVote/CsArbComVote.php");
  • přihlásit se do MySQL jako databázový uživatel root a založit databázi csarbcomvote, povolit práva pro uživatele wikiuser (za předpokladu, že pod databázovým uživatelem wikiuser pracuje daný MediaWiki):
create database csarbcomvote;
GRANT ALL ON `csarbcomvote`.* TO 'wikiuser'@'%';
GRANT ALL ON `csarbcomvote`.* TO 'wikiuser'@localhost;
GRANT ALL ON `csarbcomvote`.* TO 'wikiuser'@localhost.localdomain;
GRANT DELETE,INSERT,SELECT,UPDATE ON `csarbcomvote`.* TO 'wikiuser'@'%';
GRANT DELETE,INSERT,SELECT,UPDATE ON `csarbcomvote`.* TO 'wikiuser'@localhost;
GRANT DELETE,INSERT,SELECT,UPDATE ON `csarbcomvote`.* TO 'wikiuser'@localhost.localdomain;
use csarbcomvote;
  • pro vytvoření tabulky použít obsah souboru extensions/CsArbComVote/csarbcomvote.sql
  • Vytvořit klíče (viz dále)
  • Nastavit některým uživatelům flag administrátorů voleb: Special:Userrights

Vytvoření klíčů

editovat

Administrátor

editovat
  • jeden z administrátorů voleb u sebe vygeneruje klíč následující sérii příkazů:
gpg --gen-key
# "1" .. metoda DSA a ElGamal,
# "0" .. doba platnosti klíče není omezena,
# "csarbcomvote" .. jméno a příjmení,
# "" .. Emailová adresa,
# "" .. Komentář,
# "" .. prázdné heslo
gpg --export -a "csarbcomvote"
  • výsledný text na standardním výstupu (veřejný klíč) je třeba překopírovat na webserver do cesty určené proměnnou $wgGPGPubKey.

Webserver

editovat
  • na webserveru je také potřeba vygenerovat klíč, kterým se budou podepisovat hlasy; exportovaný veřejný klíč webserveru poslouží administrátorům voleb k ověření, že hlasy opravdu pocházejí z něj
gpg --gen-key
# "1" .. metoda DSA a ElGamal,
# "0" .. doba platnosti klíče není omezena,
# "cswiki" .. jméno a příjmení,
# "" .. Emailová adresa,
# "" .. Komentář,
# "" .. prázdné heslo
gpg --export -a "cswiki"
  • výsledný text na standartním výstupu (veřejný klíč serveru) je třeba předat administrátorům
  • dále je třeba importovat a podepsat veřejný klíč administrátorů voleb, aby bylo možno jím šifrovat hlasy:
gpg --import < soubor_s_verejnym_klicem_csarbcomvote
gpg --lsign-key csarbcomvote

Administrátor

editovat
  • importuje a podepíše veřejný klíč serveru aby bylo možné zkontrolovat, že hlasy pocházejí vskutku z něj
gpg --import < soubor_s_verejnym_klicem_cswiki
gpg --lsign-key cswiki

Konfigurace

editovat

Hlavní možnosti konfigurace skýtá soubor CsArbComVote.php

  • V proměnné $wgCsArbComCandidates se nachází seznam účtů kandidátů. Příklad naplnění:
    $wgCsArbComCandidates = array('Štaflík', 'Špagetka', 'Káťa', 'Škubánek');
  • V proměnné $wgGPGHomedir je adresář, kde se nachází konfigurace gpg. Uživatel, pod nímž běží webserver, musí mít v tomto adresáři práva psát a číst z tam umístěných konfiguračních souborů. Příklad naplnění:
    $wgGPGHomedir = "/home/apache/.gnupg";
  • V proměnné $wgGPGPubKey je cesta k souboru, kde se nachází veřejný administrátorů voleb. Příklad naplnění:
    $wgGPGPubKey = "/home/apache/www/mediawiki-1.5.2/extensions/CsArbComVote/pub.txt";
  • V proměnné $wgGPGServerPubKey je cesta k souboru, kde se nachází veřejný klíč serveru.
  • V proměnné $wgCsArbComVoteEditCount je počet editací článků nutných k připuštění hlasujícího k volbám. Příklad naplnění:
    $wgCsArbComVoteEditCount = 50;
  • V proměnné $wgCsArbComVoteCountDate je datum začátku voleb. Příklad nastavení začátku voleb na 23.11.2005 18:54:
    $wgCsArbComVoteCountDate = '20051123185400';
  • V proměnné wgCsArbComVoteFinishDate je stejným způsobem zadáno datum konce voleb.

Další kroky ke zprovoznění

editovat
  • Otestovat, vychytat chyby.
  • Projít hlášení vypisovaná uživatelům, případně vypilovat.
  • Vyjasnit mechanismus předávání GPG klíčů.
  • Zvolit administrátory voleb.
  • Požádat Tima Starlinga nebo jiného vývojáře o nainstalování.

Testovací stránky

editovat