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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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ářeextensions
) - 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 | editovat zdroj]Administrátor
[editovat | editovat zdroj]- 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 | editovat zdroj]- 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 | editovat zdroj]- 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 | editovat zdroj]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 | editovat zdroj]- Otestovat, vychytat chyby.
- Projít hlášení vypisovaná uživatelům, případně vypilovat.
- Vyjasnit mechanismus předávání GPG klíčů.
- Vyjasnit, co je na popisech v #Vytvoření klíčů nejasného.
- Zvolit administrátory voleb.
- Požádat Tima Starlinga nebo jiného vývojáře o nainstalování.
Testovací stránky
[editovat | editovat zdroj]-
Speciální stránky
-
Hlavní stránka tohoto rozšíření
-
Hlasování
-
Výsledek hlasování uživatele
-
Seznam dosavadních hlasů
-
Zakódovaný záznam voleb
-
Nastavení práv administrátora voleb
-
Seznam dosavadních hlasů jak jej vidí administrátor