Přeskočit na obsah

Wikipedista:Beren/CsArbComVote

Z Wikipedie, otevřené encyklopedie

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.

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ář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 | 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.
  • 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íčů.
  • Zvolit administrátory voleb.
  • Požádat Tima Starlinga nebo jiného vývojáře o nainstalování.

Testovací stránky

[editovat | editovat zdroj]