CheckUser Protect

Материал из Викиреальностя
Перейти к: навигация, поиск

CheckUser Protect — модификация расширения MediaWiki для проверки IP-адресов и личных данных участников CheckUser, добавляющая право, защищающее участников от проверки чекюзерами (IP-адреса такого участника получить нельзя; при проверке диапазонов и IP-адресов его данные не отображаются).

Авторы модификации — Edward Chernenko и Oversighted484.

Содержание

[править] История

Введение права checkuser-protect, защищающего от проверок, впервые было предложено 1 апреля 2011 года в Викиреальности для Нового движка Абсурдопедии в рамках проводимого Edward’ом Chernenko опроса. Edward Chernenko написал, что если расширение CheckUser будет реализовано в новом движке, то и такое право тоже обязательно будет.

В тот же день неким пользователем Aqquzf был открыт запрос «Allow per-user or per-group exemptions from the use of CheckUser» на Багзилле Викимедиа. В ходе обсуждения некоторые разработчики выразили сомнение в необходимости введения защиты от проверок и пометили запрос как «WONTFIX».

16 апреля 2011 года участником Викиреальности Змей была открыта тема, в которой он предложил заняться написанием патча участникам Викиреальности. 17 апреля 2011 года Edward Chernenko сообщил, что займется этим через два дня.

20 апреля 2011 года модификация была написана и размещена в Викиреальности.

[править] Установка

  • Загрузить и установить расширение CheckUser (проверено на версии для MediaWiki 1.16.x и trunk).
  • Модифицировать файл extensions/CheckUser/CheckUser.php:
    • изменить строку 29 на 'author' => array( 'Tim Starling', 'Aaron Schulz', 'Edward Chernenko' ),.
    • изменить строку 31 на 'version' => '2.3_EC',.
    • добавить после строки 42: $wgAvailableRights[] = 'checkuser-protect';
  • Модифицировать файл extensions/CheckUser/CheckUser_body.php:
    • В функциях doUserIPsRequest и doUserEditsRequest после строчки $user_id = User::idFromName( $user ); добавить код:
$user_object = User::newFromName($user);
 
if ( $user_object && $user_object->isAllowed( 'checkuser-protect' ) ) {
        if ( !$this->addLogEntry( 'userips-protected', 'user', $user, $reason, $user_id ) ) {
                $wgOut->addHTML( '<p>' . wfMsgHtml( 'checkuser-log-fail' ) . '</p>' );
        }
        $wgOut->addWikiMsg( 'checkuser-protecteduser' );
        return;
}
  • В функции doIPEditsRequest найти строчку $s .= $this->CUChangesLine( $row, $reason ); и заменить ее на:
$user_object = User::newFromName($row->cuc_user_text);
 
if ( $user_object && $user_object->isAllowed( 'checkuser-protect' ) ) {
        # protected
} else {
        $s .= $this->CUChangesLine( $row, $reason );
}
  • В функции doIPUsersRequest найти код:
while ( ( $row = $dbr->fetchObject( $ret ) ) != false ) {
        if ( !array_key_exists( $row->cuc_user_text, $users_edits ) ) {
                $users_last[$row->cuc_user_text] = $row->cuc_timestamp;
                $users_edits[$row->cuc_user_text] = 0;
                $users_ids[$row->cuc_user_text] = $row->cuc_user;
                $users_infosets[$row->cuc_user_text] = array();
                $users_agentsets[$row->cuc_user_text] = array();
        }
        $users_edits[$row->cuc_user_text] += 1;
        $users_first[$row->cuc_user_text] = $row->cuc_timestamp;
        # Treat blank or NULL xffs as empty strings
        $xff = empty( $row->cuc_xff ) ? null : $row->cuc_xff;
        $xff_ip_combo = array( $row->cuc_ip, $xff );
        # Add this IP/XFF combo for this username if it's not already there
        if ( !in_array( $xff_ip_combo, $users_infosets[$row->cuc_user_text] ) ) {
                $users_infosets[$row->cuc_user_text][] = $xff_ip_combo;
        }
        # Add this agent string if it's not already there; 10 max.
        if ( count( $users_agentsets[$row->cuc_user_text] ) < 10 ) {
                if ( !in_array( $row->cuc_agent, $users_agentsets[$row->cuc_user_text] ) ) {
                        $users_agentsets[$row->cuc_user_text][] = $row->cuc_agent;
                }
        }
}

И заменить его на следующий код:

while( ( $row = $dbr->fetchObject( $ret ) ) != false ) {
        $user_object = User::newFromName($row->cuc_user_text);
 
        if ( $user_object && $user_object->isAllowed( 'checkuser-protect' ) ) {
                # protected
        } else {                        
                if( !array_key_exists( $row->cuc_user_text, $users_edits ) ) {
                        $users_last[$row->cuc_user_text] = $row->cuc_timestamp;
                        $users_edits[$row->cuc_user_text] = 0;
                        $users_ids[$row->cuc_user_text] = $row->cuc_user;
                        $users_infosets[$row->cuc_user_text] = array();
                        $users_agentsets[$row->cuc_user_text] = array();
                }
 
                $users_edits[$row->cuc_user_text] += 1;
                $users_first[$row->cuc_user_text] = $row->cuc_timestamp;
                # Treat blank or NULL xffs as empty strings
                $xff = empty( $row->cuc_xff ) ? null : $row->cuc_xff;
                $xff_ip_combo = array( $row->cuc_ip, $xff );
                # Add this IP/XFF combo for this username if it's not already there
                if( !in_array( $xff_ip_combo, $users_infosets[$row->cuc_user_text] ) ) {
                        $users_infosets[$row->cuc_user_text][] = $xff_ip_combo;
                }
                # Add this agent string if it's not already there; 10 max.
                if( count( $users_agentsets[$row->cuc_user_text] ) < 10 ) {
                        if( !in_array( $row->cuc_agent, $users_agentsets[$row->cuc_user_text] ) ) {
                                $users_agentsets[$row->cuc_user_text][] = $row->cuc_agent;
                        }
                }
        }
}

[править] Системные сообщения

Для корректной работы модификации необходимо создать следующие системные сообщения:

не может быть проверен средствами CheckUser
  • MediaWiki:Checkuser-protecteduser — ошибка, появляющаяся на странице проверки при попытке проверить участника с правом checkuser-protect:
Этот участник защищён и не может быть проверен средствами CheckUser.
$1 запросил IP-адреса для защищённого участника $2
$1 запросил правки для защищённого участника $2

[править] Примеры использования

  • Двухуровневый чекюзинг: чекюзеры разделяются на бюрократов, которые могут проверять всех без исключения участников, и обычных проверяющих, которые могут проверять только анонимов и новичков. Для его использования добавьте в LocalSettings.php:
# Защита от проверок для автоподтвержденных
$wgGroupPermissions['autoconfirmed']['checkuser-protect'] = true;
 
# Добавление группы 'demoted', члены которой перестают быть автоподтвержденными
# Группа может присваиваться и сниматься участниками с правом 'userrights'
$wgGroupPermissions['demoted']['demoted'] = true;
$wgAutopromote = array(
        'autoconfirmed' => array( '&',
                array( APCOND_EDITCOUNT, &$wgAutoConfirmCount ),
                array( APCOND_AGE, &$wgAutoConfirmAge ),
                array( '!', array( APCOND_INGROUPS, 'demoted' ) ),
        ),
);
  • Публичный факт совершения проверки: все участники по умолчанию имеют правок защиты от проверки, лишать его могут проверяющие посредством публичного действия: снятия флага, после проведения проверки они обязаны его возвращать. Таким образом, ведется публичный лог проверяемых участников. Недостаток метода: невозможно получить участников, работающих с IP-диапазона, необходимо проверять каждого в отдельности. Для его использования добавьте в LocalSettings.php:
# Защита от проверок для группы 'protected'
$wgGroupPermissions['protected']['checkuser-protect'] = true;
 
# Добавление группы 'demoted', члены которой перестают быть автоподтвержденными
# Автополучение группы 'protected' после совершения первой правки
# Группа 'demoted' может присваиваться и сниматься участниками с правом 'userrights'
$wgGroupPermissions['demoted']['demoted'] = true;
$wgAutopromote = array(
        'autoconfirmed' => array( '&',
                array( APCOND_EDITCOUNT, &$wgAutoConfirmCount ),
                array( APCOND_AGE, &$wgAutoConfirmAge ),
        ),
        'protected' => array( '&',
                array( APCOND_EDITCOUNT, '1' ),
                array( '!', array( APCOND_INGROUPS, 'demoted' ) ),
        ),
);
CheckUser Protect относится к теме «Чекюзинг»   ±