aboutsummaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorTim Starling <tstarling@users.mediawiki.org>2004-05-15 10:36:59 +0000
committerTim Starling <tstarling@users.mediawiki.org>2004-05-15 10:36:59 +0000
commitf8bbc61b42955abfa56695e846adf543ab20d203 (patch)
treedfb8e221dda2a6b4b11d56d1c1588332af1c51a0 /extensions
parent316329d0f80f1b626d5d63f5cde78f1b1bb38c61 (diff)
downloadmediawikicore-f8bbc61b42955abfa56695e846adf543ab20d203.tar.gz
mediawikicore-f8bbc61b42955abfa56695e846adf543ab20d203.zip
Various board vote enhancements, moving to the BoardVote directory
Notes
Notes: http://mediawiki.org/wiki/Special:Code/MediaWiki/3591
Diffstat (limited to 'extensions')
-rw-r--r--extensions/BoardVote.php412
1 files changed, 0 insertions, 412 deletions
diff --git a/extensions/BoardVote.php b/extensions/BoardVote.php
deleted file mode 100644
index 4659ddb2d9c3..000000000000
--- a/extensions/BoardVote.php
+++ /dev/null
@@ -1,412 +0,0 @@
-<?php
-
-# Wikimedia Foundation Board of Trustees Election
-
-# Register extension
-$wgExtensionFunctions[] = "wfBoardvoteSetup";
-
-
-function wfBoardvoteSetup()
-{
-# Look out, freaky indenting
-# All this happens after SpecialPage.php has been included in Setup.php
-
-class BoardVotePage extends SpecialPage {
- var $mPosted, $mContributing, $mVolunteer, $mDBname, $mUserDays, $mUserEdits;
- var $mHasVoted, $mAction, $mUserKey;
-
- function BoardVotePage() {
- SpecialPage::SpecialPage( "Boardvote" );
- }
-
- function execute( $par ) {
- global $wgUser, $wgDBname, $wgInputEncoding, $wgRequest, $wgBoardVoteDB;
-
- $this->mUserKey = iconv( $wgInputEncoding, "UTF-8", $wgUser->getName() ) . "@$wgDBname";
- $this->mPosted = $wgRequest->wasPosted();
- $this->mContributing = $wgRequest->getInt( "contributing" );
- $this->mVolunteer = $wgRequest->getInt( "volunteer" );
- $this->mDBname = $wgBoardVoteDB;
- $this->mHasVoted = $this->hasVoted( $wgUser );
-
- if ( $par ) {
- $this->mAction = $par;
- } else {
- $this->mAction = $wgRequest->getText( "action" );
- }
-
- $this->setHeaders();
-
- if ( $this->mAction == "list" ) {
- $this->displayList();
- } elseif ( $this->mAction == "dump" ) {
- $this->dump();
- } elseif( $this->mAction == "vote" ) {
- if ( !$wgUser->getID() ) {
- $this->notLoggedIn();
- } else {
- $this->getQualifications( $wgUser );
- if ( $this->mUserDays < 90 ) {
- $this->notQualified();
- } elseif ( $this->mPosted ) {
- $this->logVote();
- } else {
- $this->displayVote();
- }
- }
- } else {
- $this->displayEntry();
- }
- }
-
- function displayEntry() {
- global $wgOut;
- $wgOut->addWikiText( wfMsg( "boardvote_entry" ) );
- }
-
- function hasVoted( &$user ) {
- global $wgDBname;
- $row = wfGetArray( $this->mDBname . ".log", array( "1" ),
- array( "log_user_key" => $this->mUserKey ), "BoardVotePage::getUserVote" );
- if ( $row === false ) {
- return false;
- } else {
- return true;
- }
- }
-
- function logVote() {
- global $wgUser, $wgDBname, $wgIP, $wgOut;
- $fname = "BoardVotePage::logVote";
-
- $now = wfTimestampNow();
- $record = $this->encrypt( $this->mContributing, $this->mVolunteer );
- $db = $this->mDBname;
-
- # Mark previous votes as old
- $encKey = wfStrencode( $this->mUserKey );
- $sql = "UPDATE $db.log SET log_current=0 WHERE log_user_key='$encKey'";
- wfQuery( $sql, DB_WRITE, $fname );
-
- # Add vote to log
- wfInsertArray( "$db.log", array(
- "log_user" => $wgUser->getID(),
- "log_user_text" => $wgUser->getName(),
- "log_user_key" => $this->mUserKey,
- "log_wiki" => $wgDBname,
- "log_edits" => $this->mUserEdits,
- "log_days" => $this->mUserDays,
- "log_record" => $record,
- "log_ip" => $wgIP,
- "log_xff" => @$_SERVER['HTTP_X_FORWARDED_FOR'],
- "log_ua" => $_SERVER['HTTP_USER_AGENT'],
- "log_timestamp" => $now,
- "log_current" => 1
- ), $fname );
-
- $wgOut->addWikiText( wfMsg( "boardvote_entered", $record ) );
- }
-
- function displayVote() {
- global $wgContributingCandidates, $wgVolunteerCandidates, $wgOut;
-
- $thisTitle = Title::makeTitle( NS_SPECIAL, "Boardvote" );
- $action = $thisTitle->getLocalURL( "action=vote" );
- if ( $this->mHasVoted ) {
- $intro = wfMsg( "boardvote_intro_change" );
- } else {
- $intro = wfMsg( "boardvote_intro" );
- }
- $contributing = wfMsg( "boardvote_contributing" );
- $volunteer = wfMsg( "boardvote_volunteer" );
- $ok = wfMsg( "ok" );
-
- $candidatesV = $candidatesC = array();
- foreach( $wgContributingCandidates as $i => $candidate ) {
- $candidatesC[] = array( $i, $candidate );
- }
- foreach ( $wgVolunteerCandidates as $i => $candidate ) {
- $candidatesV[] = array( $i, $candidate );
- }
-
- srand ((float)microtime()*1000000);
- shuffle( $candidatesC );
- shuffle( $candidatesV );
-
- $text = "
- $intro
- <form name=\"boardvote\" id=\"boardvote\" method=\"post\" action=\"$action\">
- <table border='0'><tr><td colspan=2>
- <h2>$contributing</h2>
- </td></tr>";
- $text .= $this->voteEntry( -1, wfMsg( "boardvote_abstain" ), "contributing" );
- foreach ( $candidatesC as $candidate ) {
- $text .= $this->voteEntry( $candidate[0], $candidate[1], "contributing" );
- }
- $text .= "
- <tr><td colspan=2>
- <h2>$volunteer</h2></td></tr>";
- $text .= $this->voteEntry( -1, wfMsg( "boardvote_abstain" ), "volunteer" );
- foreach ( $candidatesV as $candidate ) {
- $text .= $this->voteEntry( $candidate[0], $candidate[1], "volunteer" );
- }
-
- $text .= "<tr><td>&nbsp;</td><td>
- <input name=\"submit\" type=\"submit\" value=\"$ok\">
- </td></tr></table></form>";
- $text .= wfMsg( "boardvote_footer" );
- $wgOut->addHTML( $text );
- }
-
- function voteEntry( $index, $candidate, $name ) {
- if ( $index == -1 ) {
- $checked = " CHECKED";
- } else {
- $checked = "";
- }
-
- return "
- <tr><td align=\"right\">
- <input type=\"radio\" name=\"$name\" value=\"$index\"$checked>
- </td><td align=\"left\">
- $candidate
- </td></tr>";
- }
-
- function notLoggedIn() {
- global $wgOut;
- $wgOut->addWikiText( wfMsg( "boardvote_notloggedin" ) );
- }
-
- function notQualified() {
- global $wgOut;
- $wgOut->addWikiText( wfMsg( "boardvote_notqualified", $this->mUserDays ) );
- }
-
- function encrypt( $contributing, $volunteer ) {
- global $wgVolunteerCandidates, $wgContributingCandidates;
- global $wgGPGCommand, $wgGPGRecipient, $wgGPGHomedir;
- $file = @fopen( "/dev/urandom", "r" );
- if ( $file ) {
- $salt = implode( "", unpack( "H*", fread( $file, 64 ) ));
- fclose( $file );
- } else {
- $salt = Parser::getRandomString() . Parser::getRandomString();
- }
- $record =
- "Contributing: $contributing (" .$wgContributingCandidates[$contributing] . ")\n" .
- "Volunteer: $volunteer (" . $wgVolunteerCandidates[$volunteer] . ")\n" .
- "Salt: $salt\n";
- # Get file names
- $input = tempnam( "/tmp", "gpg_" );
- $output = tempnam( "/tmp", "gpg_" );
-
- # Write unencrypted record
- $file = fopen( $input, "w" );
- fwrite( $file, $record );
- fclose( $file );
-
- # Call GPG
- $command = wfEscapeShellArg( $wgGPGCommand ) . " --batch --yes -ear " .
- wfEscapeShellArg( $wgGPGRecipient ) . " -o " . wfEscapeShellArg( $output );
- if ( $wgGPGHomedir ) {
- $command .= " --homedir " . wfEscapeShellArg( $wgGPGHomedir );
- }
- $command .= " " . wfEscapeShellArg( $input );
-
- shell_exec( $command );
-
- # Read result
- $result = file_get_contents( $output );
-
- # Delete temporary files
- unlink( $input );
- unlink( $output );
-
- return $result;
- }
-
- function getQualifications( &$user ) {
- $id = $user->getID();
- if ( !$id ) {
- $this->mUserDays = 0;
- $this->mUserEdits = 0;
- return;
- }
-
- # Count contributions and find earliest edit
- # First cur
- $sql = "SELECT COUNT(*) as n, MIN(cur_timestamp) as t FROM cur WHERE cur_user=$id";
- $res = wfQuery( $sql, DB_READ, "BoardVotePage::getQualifications" );
- $cur = wfFetchObject( $res );
- wfFreeResult( $res );
-
- # If the user has stacks of contributions, don't check old as well
- $now = time();
- if ( is_null( $cur->t ) ) {
- $signup = $now;
- } else {
- $signup = wfTimestamp2Unix( $cur->t );
- }
-
- $days = ($now - $signup) / 86400;
- if ( $cur->n > 400 && $days > 180 ) {
- $this->mUserDays = 0x7fffffff;
- $this->mUserEdits = 0x7fffffff;
- return;
- }
-
- # Now check old
- $sql = "SELECT COUNT(*) as n, MIN(old_timestamp) as t FROM old WHERE old_user=$id";
- $res = wfQuery( $sql, DB_READ, "BoardVotePage::getQualifications" );
- $old = wfFetchObject( $res );
- wfFreeResult( $res );
-
- if ( !is_null( $old->t ) ) {
- $signup = min( wfTimestamp2Unix( $old->t ), $signup );
- }
- $this->mUserDays = (int)(($now - $signup) / 86400);
- $this->mUserEdits = $cur->n + $old->n;
- }
-
- function displayList() {
- global $wgOut, $wgOutputEncoding, $wgLang, $wgUser;
- $sql = "SELECT log_timestamp,log_user_key FROM {$this->mDBname}.log ORDER BY log_user_key";
- $res = wfQuery( $sql, DB_READ, "BoardVotePage::list" );
- if ( wfNumRows( $res ) == 0 ) {
- $wgOut->addWikiText( wfMsg( "boardvote_novotes" ) );
- return;
- }
- $thisTitle = Title::makeTitle( NS_SPECIAL, "Boardvote" );
- $sk = $wgUser->getSkin();
- $dumpLink = $sk->makeKnownLinkObj( $thisTitle, wfMsg( "boardvote_dumplink" ), "action=dump" );
-
- $intro = wfMsg( "boardvote_listintro", $dumpLink );
- $hTime = wfMsg( "boardvote_time" );
- $hUser = wfMsg( "boardvote_user" );
- $hContributing = wfMsg( "boardvote_contributing" );
- $hVolunteer = wfMsg( "boardvote_volunteer" );
-
- $s = "$intro <table border=1><tr><th>
- $hUser
- </th><th>
- $hTime
- </th></tr>";
-
- while ( $row = wfFetchObject( $res ) ) {
- if ( $wgOutputEncoding != "utf-8" ) {
- $user = wfUtf8ToHTML( $row->log_user_key );
- } else {
- $user = $row->log_user_key;
- }
- $time = $wgLang->timeanddate( $row->log_timestamp );
- $s .= "<tr><td>
- $user
- </td><td>
- $time
- </td></tr>";
- }
- $s .= "</table>";
- $wgOut->addHTML( $s );
- }
-
- function dump() {
- global $wgOut, $wgOutputEncoding, $wgLang, $wgUser;
-
- $userRights = $wgUser->getRights();
- if ( in_array( "boardvote", $userRights ) ) {
- $admin = true;
- } else {
- $admin = false;
- }
-
- $sql = "SELECT * FROM {$this->mDBname}.log";
- $res = wfQuery( $sql, DB_READ, "BoardVotePage::list" );
- if ( wfNumRows( $res ) == 0 ) {
- $wgOut->addWikiText( wfMsg( "boardvote_novotes" ) );
- return;
- }
- $s = "<table border=1>";
- if ( $admin ) {
- $s .= wfMsg( "boardvote_dumpheader" );
- }
-
- while ( $row = wfFetchObject( $res ) ) {
- if ( $wgOutputEncoding != "utf-8" ) {
- $user = wfUtf8ToHTML( $row->log_user_key );
- } else {
- $user = $row->log_user_key;
- }
- $time = $wgLang->timeanddate( $row->log_timestamp );
- $record = nl2br( $row->log_record );
- if ( $admin ) {
- $edits = $row->log_edits == 0x7fffffff ? "many" : $row->log_edits;
- $days = $row->log_days == 0x7fffffff ? "many" : $row->log_days;
- $s .= "<tr><td>
- $time
- </td><td>
- $user
- </td><td>
- $edits
- </td><td>
- $days
- </td><td>
- {$row->log_ip}
- </td><td>
- {$row->log_ua}
- </td><td>
- $record
- </td></tr>";
- } else {
- $s .= "<tr><td>$time</td><td>$user</td><td>$record</td></tr>";
- }
- }
- $s .= "</table>";
- $wgOut->addHTML( $s );
- }
-}
-
-SpecialPage::addPage( new BoardVotePage );
-
-global $wgMessageCache;
-$wgMessageCache->addMessages( array(
-# Board vote
-"boardvote" => "Wikimedia Board of Trustees election",
-"boardvote_entry" =>
-"* [[Special:Boardvote/vote|Vote]]
-* [[Special:Boardvote/list|List votes to date]]
-* [[Special:Boardvote/dump|Dump encrypted election record]]",
-"boardvote_intro" => "<p>Please choose your preferred candidate for both the
-Contributing Representative and the Volunteer Representative.</p>",
-"boardvote_intro_change" => "<p>You have voted before. However you may change
-your vote using the form below.</p>",
-"boardvote_abstain" => "Abstain",
-"boardvote_footer" => "&nbsp;",
-"boardvote_entered" => "Thank you, your vote has been recorded.
-
-Following is your encrypted vote record. It will appear publicly at [[Special:Boardvote/dump]].
-
-<pre>$1</pre>
-
-[[Special:Boardvote/entry|Back]]",
-"boardvote_notloggedin" => "You are not logged in. To vote, you must use an account
-which has existed for at least 90 days.",
-"boardvote_notqualified" => "Sorry, your first contribution was only $1 days ago.
-You need to have been contributing for at least 90 days to vote in this election.",
-"boardvote_novotes" => "Nobody has voted yet.",
-"boardvote_contributing" => "Contributing candidate",
-"boardvote_volunteer" => "Volunteer candidate",
-"boardvote_time" => "Time",
-"boardvote_user" => "User",
-"boardvote_listintro" => "<p>This is a list of all votes which have been recorded
-to date. $1 for the full encrypted election record.</p>",
-"boardvote_dumplink" => "Click here",
-"boardvote_dumpheader" => "<caption><strong>Election administrator private dump</strong></caption>
-<tr><th>Time</th><th>User</th><th>Edits</th><th>Days</th>
-<th>IP</th><th>User agent</th><th>Record</th></tr>"
-
-));
-
-} # End of extension function
-
-?>