Расширение:SecurePoll
Статус релиза: стабильно |
|
|---|---|
| Реализация | Служебная страница |
| Описание | Позволяет проводить выборы, опросы и анкетирование |
| Автор(ы) | Tim Starlingобсуждение |
| Последняя версия | 3.0.0 (постоянные обновления) |
| Политика совместимости | Снэпшоты выходят вместе с MediaWiki. Мастер не имеет обратной совместимости. |
| MediaWiki | 1.25+ |
| Изменения в БД | Да |
| Таблицы | securepoll_entity securepoll_msgs securepoll_properties securepoll_elections securepoll_questions securepoll_options securepoll_voters securepoll_votes securepoll_strike securepoll_lists securepoll_cookie_match |
| Лицензия | GNU General Public License 2.0 или позднее |
| Скачать | |
|
|
|
|
| Переведите расширение SecurePoll, если оно доступно на translatewiki.net | |
| Проблемы | Открытые задачи · Сообщить об ошибке |
SecurePoll это расширение, позволяющее проводить выборы, опросы и анкетирование. Оно используется для выборов в Совет Фонда Викимедиа, в некоторые Арбитражные комитеты, а также для различных других голосований и опросов в проектах Фонда Викимедиа.
Скриншоты
-
Главная страница расширения, на ней отображается список голосований.
-
Страница голосования с описательным текстом.
-
Журнал администрирования SecurePoll.
-
Журнал с данными голосующих в SecurePoll.
Установка
- Скачайте и распакуйте файл(ы) в папку с названием
SecurePollв вашей папкеextensions/.
Вместо этого разработчикам и соавторам кода следует установить расширение из Git, используя:cd extensions/ git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/SecurePoll
- Добавьте следующий код в конце вашего файла LocalSettings.php:
wfLoadExtension( 'SecurePoll' );
- Выполните скрипт обновления, который автоматически создаст необходимые таблицы, используемые расширением.
Готово – Перейдите на страницу Special:Version на своей вики, чтобы удостовериться в том, что расширение успешно установлено.
In addition, you will need to add some user groups and user rights to your LocalSettings.php file. Here is one way to do it, which gives a new group called electionadmin the power to do everything in SecurePoll (create polls, edit polls, see voter IP addresses):
$wgGroupPermissions['electionadmin']['securepoll-create-poll'] = true;
$wgGroupPermissions['electionadmin']['securepoll-edit-poll'] = true;
$wgGroupPermissions['electionadmin']['securepoll-view-voter-pii'] = true;
Once this group is created, a bureaucrat can add someone to the group using Special:UserRights. Then that person can visit Special:SecurePoll to view polls, create polls, edit polls, tally polls, etc.
Each poll's data is compartmentalized. You can have 100 electionadmins, but if you only add one electionadmin to a particular poll, only that one electionadmin will be able to edit that particular poll or see user IPs. If an electionadmin is removed from a poll, they will lose access to it.
securepoll-view-voter-pii is used for "scrutineering" a poll, which involves looking at a list of voter IPs, user agents, and X-Forwarded-For headers to look for cheating (secret duplicate votes by sockpuppets). Because this involves looking at voter IP addresses and other sensitive, personal, de-anonymizing data, it is a sensitive user right, so only trusted users should be assigned to the electionadmin group.
It is possible to split securepoll-view-voter-pii into a separate group. You can use a config such as the one below to create a group called scrutineer that contains the securepoll-view-voter-pii right, separating it from the electionadmin group:
$wgGroupPermissions['electionadmin']['securepoll-create-poll'] = true;
$wgGroupPermissions['electionadmin']['securepoll-edit-poll'] = true;
$wgGroupPermissions['scrutineer']['securepoll-create-poll'] = true;
$wgGroupPermissions['scrutineer']['securepoll-edit-poll'] = true;
$wgGroupPermissions['scrutineer']['securepoll-view-voter-pii'] = true;
A user also needs to be added to the poll (and hence have the securepoll-edit-poll right) in order to view PII - securepoll-view-voter-pii by itself has no effect.
Использование
Создание нового голосования
Есть два способа создать новое голосование: вручную создать XML-файл и импортировать его, или использовать интерфейс создания голосований на Special:SecurePoll.
Вручную
Чтобы создать голосование вручную, необходимо:
- создать XML-файл
- импортировать его, запустив команду
import.phpв интерфейсе командной строки
В папке test вы можете найти четыре файла с примерами:
3way-test.xmlapproval-test.xmlradio-range.xmlschulze-test.xmlinfo
Чтобы импортировать голосование, запустите следующую команду:
extensions/SecurePoll/maintenance$ php importElectionConfiguration.php ../tests/phpunit/data/3way-test.xml
Чтобы импортировать голосование с помощью docker, запустите следующую команду:
docker-compose exec mediawiki php extensions/SecurePoll/maintenance/importElectionConfiguration.php extensions/SecurePoll/tests/phpunit/data/3way-test.xml
Через веб-интерфейс
Участники(цы), имеющие право securepoll-create-poll, могут создавать новые голосования с помощью специальной ссылки внизу страницы Special:SecurePoll.
Чтобы создать новое голосование, заполните обязательные поля в форме создания. Особое внимание может потребоваться при заполнении следующих полей:
- Только члены группы
electionadminмогут добавляться в голосования в качестве администраторов. Если параметр$wgSecurePollUseLoggingустановлен в значениеtrue, то при добавлении или удалении администратора в голосовании, это будет записываться в специальный журнал. Этот журнал доступен на странице Special:SecurePollLog. - Чтобы создать зашифрованное голосование, выберите метод шифрования. Если выбран метод GnuPG, будут сгенерированы (публичный) ключ шифрования и (частный) ключ дешифрования. Ключ шифрования следует ввести в форму создания, а закрытый ключ следует хранить в безопасности где-то вне сети (он понадобится для подсчёта голосов после выборов). Подробный пример смотрите [$1 здесь].
Теперь перейдите на Special:SecurePoll и вы увидите созданное вами голосование.
At the top of the poll is some introductory text about the poll.
By default it will show [text], and this can be edited via the translation interface (see below).
Редактирование существующего голосования
Чтобы редактировать опрос, вы должны быть администратором этого голосования. На странице Special:SecurePoll нажмите на ссылку «Редактировать» рядом с тем голосованием, которое вы хотите отредактировать.
Всё, что связано с выборами, может быть отредактировано до начала выборов. После начала выборов некоторые элементы редактировать нельзя.
Редактирование списка голосующих
Для редактирования списка участников голосования вы должны быть его администратором. На странице Special:SecurePoll нажмите на ссылку «Редактировать» рядом с тем голосованием, которое вы хотите отредактировать.
Перевод голосования
Для перевода голосования вы должны быть его администратором. На странице Special:SecurePoll нажмите на ссылку «Редактировать» рядом с тем голосованием, которое вы хотите перевести.
Просмотр списка проголосовавших
Любой желающий может просмотреть список проголосовавших, если только функция прозрачности голосования не была отключена при создании опроса.
Администраторы конкретного голосования могут видеть список проголосовавших, а также частную информацию, которая может помочь в выявлении дубликатов голосов (например, IP-адрес, информацию об юзер-агенте, общие файлы cookie).
Если для параметра $wgSecurePollUseLogging установлено значение true, каждый раз, когда администратор просматривает частные данные, это будет записываться в журнале. Записи журнала находятся на странице Special:SecurePollLog.
Администраторы могут отклонять любые голоса, которые, по их мнению, являются дубликатами.
Подсчет голосов
Подсчитывать голоса в голосовании может только администратор этого голосования. На странице Special:SecurePoll нажмите на ссылку подсчёта голосов рядом с тем голосованием, голоса в котором вы хотите подсчитать.
Если голосвание было подсчитано раньше, результаты будут показаны на странице. Если нет, или если вы хотите пересчитать голоса, есть форма для начала нового подсчёта.
- Если голоса не зашифрованы, нажмите на кнопку подсчёта.
- Если голосование зашифровано, вам может потребоваться ввести дополнительную информацию. Например, если используется GnuPG, введите (частный) ключ расшифровки и нажмите на кнопку подсчёта голосов. Если в зашифрованном списке много голосов, подсчёт может занять много времени. Вам может понадобиться проверить результаты позже.
Теперь перейдите на $1 и вы увидите созданное вами голосование.
Подсчёт голосов (СЕПГ)
Более подробную информацию можно найти в Википедии: , подсчёт голосов СЕПГ (на английском).
Общая реализация алгоритма источник (англ.).
Порог голосов + .000000001. Порог голосов (квота) это минимальное количество голосов, необходимое для получения места.
1. Рассчитайте порог голосов. 2. Распределите голоса между кандидатами в порядке предпочтения. 3. Объявить победителями всех кандидатов, перешагнувших порог голосования. 4. Передайте излишек голосов от победителей следующим кадидатам по порядку предпочтения. 5. Повторяйте шаги 3 и 4 до тех пор, пока не останется ни одного нового кандидата, которого необходимо избрать. (При некоторых схемах в начале голосования голоса могут быть перераспределены между предыдущими победителями и проигравшими. Это может повлиять на исход выборов). Если на все места есть победители, процесс завершён. В противном случае: 6. Исключите одного или нескольких кандидатов, как правило, либо кандидата с наименьшим числом голосов, либо всех кандидатов, совокупное число голосов которых меньше голосов наименьшего оставшегося кандидата. 7. Передайте голоса проигравших оставшимся кандидатам. 8. Повторяйте шаги с 3 по 7, пока все места не будут заполнены.
Порог, который мы используем (шаг 1), это квота, расчитанная по :
floor( no. votes / (no. seats + 1) ) + 1
Метод передачи голосов от избранных или выбывших кандидатов это метод Мика:
Подсчёт голосов (JobRunner)
- Обработка итогов может осуществляться с помощью запланированного задания [[Руководство:Очередь задач|Руководство:Очередь задач]]. Убедитесь, что вы создали запланированное задание для задачи или выполнили её вручную.
- Голоса также можно обрабатывать, выполняя сценарий подсчёта вручную:
Чтобы выполнить подсчёт, запустите следующую команду из папки cli, расположенной в $1:
extensions/SecurePoll/maintenance/TallyElection.php
Чтобы выполнить подсчёт с помощью MediaWiki-Docker, запустите следующую команду из папки cli, расположенной в $1:
docker-compose exec mediawiki php extensions/SecurePoll/maintenance/TallyElection.php
Создание тестовых голосований (СЕПГ)
- Тестовые голосования (СЕПГ) могут быть сгенерированы из папки cli, расположенной в $1:
- Чтобы создать тестовое голосование, запустите следующую команду из папки cli, расположенной в $1:
extensions/SecurePoll/maintenance/GenerateTestElection.php
- Тестовые голосования (СЕПГ) обеспечивают платформу для подсчета голосов.
Redirect polls
A redirect poll is a poll that shows up in the list of polls at Special:SecurePoll, but clicking on "vote" and other links will redirect the voter to a different wiki. This is useful if you do all of your votes on a central votewiki (in Wikimedia's case, https://vote.wikimedia.org).
Special:SecurePoll/create will show an additional drop-down list called "For wiki:"—allowing you to select "This wiki", "All wikis", or a different wiki in your wiki farm—if all of the following conditions are met:
- You are using a wiki farm (multiple wikis using the same file system but different databases).
- You haven't excluded all other wikis using
$wgSecurePollExcludedWikis. - You have
$wgCanonicalServerconfigured to have a period (use different subdomains) on each wiki. - You have
$wgSecurePollEditOtherWikis = true;for your current wiki.
If you have a wiki in your wiki farm that doesn't have SecurePoll installed, be sure to add it to $wgSecurePollExcludedWikis to keep it out of the "For wiki:" list.
| "For wiki" dropdown item selected | What it does locally | What it does on other wikis |
|---|---|---|
| This wiki | Creates a local election | Nothing |
| All wikis | Creates a local election | Creates "redirect polls" at every other wiki in the wiki farm |
| Picking a specific other wiki such as es.wikipedia.org | Creates a local election | Creates a "redirect poll" at the chosen wiki |
Testing note: $wgCanonicalServer must contain domains with subdomains. So for example, http://localhost will not get the dropdown list to show up, but http://en.localhost will.
$wgConf->settings = [
'wgCanonicalServer' => [
'my_database' => 'http://en.localhost:8080',
'secondwiki' => 'http://es.localhost:8080'
],
In the database, fields related to redirect polls include securepoll_elections.el_auth_type (can be local or mw-remote), and the following securepoll_properties.pr_keys: jump-id, jump-url, and main-wiki.
For developers
SQL tables
Note that configuring a poll to use encryption encrypts the securepoll_votes.vote_record field.
| Table | Field prefix | Description | Contains sensitive data? | Table needed for redirect polls?[1][2] |
|---|---|---|---|---|
| securepoll_cookie_match | cm_ | Used on the vote details page to display the securepoll-cookie-dup-list message ("Cookie duplicate users").
|
Yes | No |
| securepoll_elections | el_ | List of elections, and some basic config data such as the name, creator, start date, end date, language, ballot type (e.g. approval), and tally type (e.g. plurality). Additional config data is pivoted and stored in securepoll_properties instead.
|
No | Yes |
| securepoll_entity | en_ | Maps "one to many" with the securepoll_msg table. The "many" is because a securepoll_msg can be in multiple languages. Possible options for securepoll_entity.en_type are election, question, and option.
|
No | Yes |
| securepoll_lists | li_ | Stores usernames manually added via the Voter Eligibility page. Users are added in the format userName@databaseName. There are 3 types of lists:
|
No | Yes |
| securepoll_log | spl_ | If $wgSecurePollUseLogging is set to true, stores the log entries here.
|
Yes. Special:SecurePollLog is private. | No |
| securepoll_msgs | msg_ | List of strings. For example, the poll name, the poll questions, and the poll answers. This is mapped to from other tables such as securepoll_options and securepoll_questions, and supports having the same entity in multiple languages (securepoll_msgs.msg_lang).
|
No | Yes |
| securepoll_options | op_ | List of poll options for each question. Doesn't store the option text here, but rather maps it to the table securepoll_msgs.
|
No | No |
| securepoll_properties | pr_ | Config data for each election. For example, who the election admins are, whether it's a redirect poll, whether to shuffle the options, whether to use encryption, list of tallies and their values (tally-result), etc.
Is also the config data for on-the-fly voter eligibility calculation. For example, voter minimum edit count and voter not-sitewide-blocked is stored here. |
Partial. Rows with pr_key as gpg-encrypt-key, gpg-sign-key, openssl-encrypt-key, openssl-sign-key, tally-result, tally-result-time are private data. | Yes |
| securepoll_questions | qu_ | List of poll questions. Doesn't store the question text here, but rather maps it to the table securepoll_msgs.
|
No | No |
| securepoll_strike | st_ | Which votes have been struck (crossed out, removed from the tally) by election admins. Includes a reason that they can type in. | Yes. Only election admins can see the strike log from the UI. | No |
| securepoll_voters | voter_ | One row per voter per election. Voters are distinct and will not be duplicated in the same election. Contains data on the voter such as their user groups and whether they're blocked or not. Probably used to determine voter eligibility. voter_properties contains data such as wiki, blocked, sitewide blocked, central block count, central sitewide block count, edit count, bot, language, user groups, eligibility lists, and registration date.
|
Partial. This is private for elections with transparency features disabled. | No |
| securepoll_votes | vote_ | One row per vote per election. Contains data on the voter such as IP address and user agent, and contains the actual vote in the vote_record column. The "most active wiki" that the voter chose, if enabled for this poll, is stored in vote_voter_domain. vote_current=0 means that this is a duplicate vote and has been discarded; this is re-calculated for all of the user's previous votes each time they submit a new vote.
|
Yes. Contains voter PII such as IP addresses and user agents. Contains the vote itself and its timestamp (the vote date is public unless the voter list is turned off, the vote time is private). | No |
Enabling local elections on a Wikimedia wiki
SecurePoll is installed on every wiki except loginwiki and wikitech. But additional configuration is needed to get it to host local elections (and not just redirect polls / global elections).
- Phab ticket - Create a Phabricator ticket to start the process and centralize discussion. Tag it "Wikimedia-site-requests" and "MediaWiki-extensions-SecurePoll". Make the ticket a parent of T301180 Allow local wikis to set up elections.
- Consensus - Get consensus to have local elections through a noticeboard discussion on your local wiki, and then link it in the phab ticket.
- Tables - Have someone with the right production shell access (ops, deployment, restricted, analytics-privatedata-users) check that your wiki has the below tables in s1-s8 (not x1). If your wiki is missing any of these tables, ask someone with the right production shell access (ops, deployment) to create them. After T403874, these will be created by running the maintenance script WikimediaMaintenance -> createExtensionTables.php. Until that ticket is resolved, will need to do something else. Maybe copy paste some of SecurePoll -> sql/mysql/tables-generated.sql into the MariaDB monitor?
- securepoll_cookie_match
- securepoll_log - only needed if you're using the private logging feature (
$wgSecurePollUseLogging) - securepoll_options
- securepoll_questions
- securepoll_strike
- securepoll_voters
- securepoll_votes
- Patch - Write and deploy a gerrit patch similar to this one
- If you want the public logging feature (logging when election officials change election settings, logs to public pages), set
$wgSecurePollUseMediaWikiNamespace.$wgSecurePollUseNamespaceis also an option, but is discouraged, because it creates an entire namespace for a small number of pages. - If you want the private logging feature (logging when election officials view IPs, logs to a private page), set
$wgSecurePollUseLogging
- If you want the public logging feature (logging when election officials change election settings, logs to public pages), set
- NameTableAccessException - If you are getting the error "MediaWiki\Storage\NameTableAccessException: No insert possible but primary DB didn't give us a record for 'SecurePoll' in 'content_models", this is from T399633. The one time fix is to have a deployer run
INSERT INTO content_models (model_name) VALUES ('SecurePoll')
Only the following wikis are able to run local elections, until they follow the checklist above. The ability of a wiki to create local elections depends on it having a user group with the user right securepoll-create-poll. Feel free to add your wiki here once it's gone through the above process.
- enwiki
- fawiki
- officewiki
- testwiki
- votewiki
- zhwiki
Документация
SecurePoll
Общая документация SecurePoll доступна на странице wikitech:SecurePoll.
Усовершенствования SecurePoll
Краткое описание улучшений в SecurePoll можно найти на странице Anti-Harassment Tools/SecurePoll Improvements.
Понимание результатов СЕПГ
Документацию по результатам СЕПГ можно найти на странице Anti-Harassment Tools/SecurePoll Improvements/Understanding the STV result.
See also
| Это расширение используется в одном или нескольких проектах Викимедиа. Вероятно, это означает, что расширение стабильно и работает достаточно хорошо, чтобы использоваться такими сайтами с высоким трафиком. Найдите название этого расширения в файлах конфигурации Викимедиа CommonSettings.php и InitialiseSettings.php, чтобы узнать, где оно установлено. Полный список расширений, установленных на конкретной вики, можно увидеть на странице Special:Version wiki. |
| Это расширение включено в следующие вики-фермы/хостинги и/или пакеты: Это не исчерпывающий список. Некоторые вики-фермы/хостинги и/или пакеты могут содержать это расширение, даже если они не перечислены здесь. Всегда сверяйтесь со своими вики-фермами/хостингами или комплектами/бандлами для подтверждения. |
- Stable extensions/ru
- Special page extensions/ru
- GPL licensed extensions/ru
- Extensions in Wikimedia version control/ru
- CanonicalNamespaces extensions/ru
- LoadExtensionSchemaUpdates extensions/ru
- SpecialPage initList extensions/ru
- TitleQuickPermissions extensions/ru
- UserLogout extensions/ru
- All extensions/ru
- Extensions used on Wikimedia/ru
- Extensions included in Miraheze/ru
- Extensions included in WikiForge/ru
- Poll extensions/ru
