http://www.mediawiki.org/wiki/Special:Code/MediaWiki/98104
Revision: 98104
Author: aaron
Date: 2011-09-26 02:07:32 +0000 (Mon, 26 Sep 2011)
Log Message:
-----------
* Added new UserAccountRequest class
* Movied verify() et all to utility class
* Fixed missing static declarations
Modified Paths:
--------------
trunk/extensions/ConfirmAccount/ConfirmAccount.php
trunk/extensions/ConfirmAccount/dataclasses/ConfirmAccount.class.php
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/ConfirmAccount_body.php
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/RequestAccount_body.php
Added Paths:
-----------
trunk/extensions/ConfirmAccount/dataclasses/UserAccountRequest.php
Modified: trunk/extensions/ConfirmAccount/ConfirmAccount.php
===================================================================
--- trunk/extensions/ConfirmAccount/ConfirmAccount.php 2011-09-26 02:04:17 UTC
(rev 98103)
+++ trunk/extensions/ConfirmAccount/ConfirmAccount.php 2011-09-26 02:07:32 UTC
(rev 98104)
@@ -166,9 +166,11 @@
$wgAutoloadClasses['UserCredentialsPage'] =
"$dir/actions/UserCredentials_body.php";
$wgSpecialPageGroups['UserCredentials'] = 'users';
-# Data functions
$dir = dirname( __FILE__ ) . '/dataclasses';
+# Utility functions
$wgAutoloadClasses['ConfirmAccount'] = "$dir/ConfirmAccount.class.php";
+# Data access objects
+$wgAutoloadClasses['UserAccountRequest'] = "$dir/UserAccountRequest.php";
$dir = dirname( __FILE__ ) . '/schema';
# Schema changes
Modified: trunk/extensions/ConfirmAccount/dataclasses/ConfirmAccount.class.php
===================================================================
--- trunk/extensions/ConfirmAccount/dataclasses/ConfirmAccount.class.php
2011-09-26 02:04:17 UTC (rev 98103)
+++ trunk/extensions/ConfirmAccount/dataclasses/ConfirmAccount.class.php
2011-09-26 02:07:32 UTC (rev 98104)
@@ -50,7 +50,7 @@
*
* @param sring $name
*/
- public function confirmEmail( $name ) {
+ public static function confirmEmail( $name ) {
global $wgMemc;
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'account_requests',
@@ -68,7 +68,7 @@
* @param string $token
* @return string
*/
- public function confirmationTokenUrl( $token ) {
+ public static function confirmationTokenUrl( $token ) {
$title = SpecialPage::getTitleFor( 'RequestAccount' );
return $title->getFullUrl( array(
'action' => 'confirmemail',
@@ -83,11 +83,52 @@
* @param string $expiration
* @return string
*/
- public function getConfirmationToken( $user, &$expiration ) {
+ public static function getConfirmationToken( $user, &$expiration ) {
global $wgConfirmAccountRejectAge;
$expires = time() + $wgConfirmAccountRejectAge;
$expiration = wfTimestamp( TS_MW, $expires );
$token = $user->generateToken( $user->getName() .
$user->getEmail() . $expires );
return $token;
}
+
+ /**
+ * Verifies that it's ok to include the uploaded file
+ *
+ * @param string $tmpfile the full path of the temporary file to verify
+ * @param string $extension The filename extension that the file is to
be served with
+ * @return Status object
+ */
+ public static function verifyAttachment( $tmpfile, $extension ) {
+ global $wgVerifyMimeType, $wgMimeTypeBlacklist;
+ # magically determine mime type
+ $magic =& MimeMagic::singleton();
+ $mime = $magic->guessMimeType( $tmpfile, false );
+ # check mime type, if desired
+ if ( $wgVerifyMimeType ) {
+ wfDebug ( "\n\nmime: <$mime> extension:
<$extension>\n\n" );
+ # Check mime type against file extension
+ if ( !UploadBase::verifyExtension( $mime, $extension )
) {
+ return Status::newFatal( 'uploadcorrupt' );
+ }
+ # Check mime type blacklist
+ if ( isset( $wgMimeTypeBlacklist ) && !is_null(
$wgMimeTypeBlacklist )
+ && self::checkFileExtension( $mime,
$wgMimeTypeBlacklist ) ) {
+ return Status::newFatal( 'filetype-badmime',
$mime );
+ }
+ }
+ wfDebug( __METHOD__ . ": all clear; passing.\n" );
+ return Status::newGood();
+ }
+
+ /**
+ * Perform case-insensitive match against a list of file extensions.
+ * Returns true if the extension is in the list.
+ *
+ * @param string $ext
+ * @param array $list
+ * @return bool
+ */
+ protected static function checkFileExtension( $ext, $list ) {
+ return in_array( strtolower( $ext ), $list );
+ }
}
Added: trunk/extensions/ConfirmAccount/dataclasses/UserAccountRequest.php
===================================================================
--- trunk/extensions/ConfirmAccount/dataclasses/UserAccountRequest.php
(rev 0)
+++ trunk/extensions/ConfirmAccount/dataclasses/UserAccountRequest.php
2011-09-26 02:07:32 UTC (rev 98104)
@@ -0,0 +1,257 @@
+<?php
+class UserAccountRequest {
+ /* Initially supplied fields */
+ protected $id;
+ protected $name;
+ protected $realName;
+ protected $email;
+ protected $registration;
+ protected $bio;
+ protected $notes;
+ protected $urls;
+ protected $type;
+ protected $areas;
+ protected $fileName;
+ protected $fileStorageKey;
+ protected $ip;
+ protected $emailToken;
+ protected $emailTokenExpires;
+ /* Fields set if user later confirms email */
+ protected $emailAuthTimestamp;
+ /* Fields used by the admins */
+ protected $deleted;
+ protected $rejectedTimestamp;
+ protected $heldTimestamp;
+ protected $user;
+ protected $comment;
+
+ private function __construct() {}
+
+ public static function newFromRow( Object $row ) {
+ $req = new self();
+
+ $req->id = (int)$row->acr_id;
+ $req->name = $row->acr_name;
+ $req->realName = $row->acr_real_name;
+ $req->email = $row->acr_email;
+ $req->registration = wfTimestampOrNull( TS_MW,
$row->acr_registration );
+ $req->bio = $row->acr_bio;
+ $req->notes = $row->acr_notes;
+ $req->urls = $row->acr_urls;
+ $req->type = (int)$row->acr_type;
+ $req->areas = self::expandAreas( $row->acr_areas );
+ $req->fileName = $row->acr_filename;
+ $req->fileStorageKey = $row->acr_storage_key;
+ $req->ip = $row->acr_ip;
+ $req->emailToken = $row->acr_email_token; // MD5 of token
+ $req->emailTokenExpires = wfTimestampOrNull( TS_MW,
$row->acr_email_token_expires );
+ $req->emailAuthTimestamp = wfTimestampOrNull( TS_MW,
$row->acr_email_authenticated );
+ $req->deleted = (bool)$row->acr_deleted;
+ $req->rejectedTimestamp = wfTimestampOrNull( TS_MW,
$row->acr_rejected );
+ $req->heldTimestamp = wfTimestampOrNull( TS_MW, $row->acr_held
);
+ $req->user = (int)$row->acr_user;
+ $req->comment = $row->acr_comment;
+
+ return $req;
+ }
+
+ public static function newFromArray( array $fields ) {
+ $req = new self();
+
+ $req->id = isset( $fields['id'] )
+ ? (int)$fields['id']
+ : null; // determined on insertOn()
+ $req->name = $fields['name'];
+ $req->realName = $fields['real_name'];
+ $req->email = $fields['email'];
+ $req->registration = wfTimestampOrNull( TS_MW,
$fields['registration'] );
+ $req->bio = $fields['bio'];
+ $req->notes = $fields['notes'];
+ $req->urls = $fields['urls'];
+ $req->type = (int)$fields['type'];
+ $req->areas = is_string( $fields['areas'] )
+ ? self::expandAreas( $fields['areas'] ) // DB format
+ : $fields['areas']; // already expanded
+ $req->fileName = $fields['filename'];
+ $req->fileStorageKey = $fields['storage_key'];
+ $req->ip = $fields['ip'];
+ $req->emailToken = $fields['email_token']; // MD5 of token
+ $req->emailTokenExpires = wfTimestampOrNull( TS_MW,
$fields['email_token_expires'] );
+ // These fields are typically left to default on insertion...
+ $req->emailAuthTimestamp = isset(
$fields['email_authenticated'] )
+ ? wfTimestampOrNull( TS_MW,
$fields['email_authenticated'] )
+ : null;
+ $req->deleted = isset( $fields['deleted'] )
+ ? $fields['deleted']
+ : false;
+ $req->rejectedTimestamp = isset( $fields['rejected'] )
+ ? wfTimestampOrNull( TS_MW, $fields['rejected'] )
+ : null;
+ $req->heldTimestamp = isset( $fields['held'] )
+ ? wfTimestampOrNull( TS_MW, $fields['held'] )
+ : null;
+ $req->user = isset( $fields['user'] )
+ ? (int)$fields['user']
+ : 0;
+ $req->comment = isset( $fields['comment'] )
+ ? $fields['comment']
+ : '';
+
+ return $req;
+ }
+
+ public function getId() {
+ return $this->id;
+ }
+
+ public function getName() {
+ return $this->name;
+ }
+
+ public function getRealName() {
+ return $this->realName;
+ }
+
+ public function getEmail() {
+ return $this->email;
+ }
+
+ public function getRegistration() {
+ return $this->registration;
+ }
+
+ public function getBio() {
+ return $this->bio;
+ }
+
+ public function getNotes() {
+ return $this->notes;
+ }
+
+ public function getUrls() {
+ return $this->urls;
+ }
+
+ public function getAreas() {
+ return $this->areas;
+ }
+
+ public function getFileName() {
+ return $this->fileName;
+ }
+
+ public function getFileStorageKey() {
+ return $this->fileStorageKey;
+ }
+
+ public function getIP() {
+ return $this->ip;
+ }
+
+ public function getEmailToken() {
+ return $this->emailToken;
+ }
+
+ public function getEmailTokenExpires() {
+ return $this->emailTokenExpires;
+ }
+
+ public function getEmailAuthTimestamp() {
+ return $this->emailAuthTimestamp;
+ }
+
+ public function isDeleted() {
+ return $this->deleted;
+ }
+
+ public function getRejectTimestamp() {
+ return $this->rejectedTimestamp;
+ }
+
+ public function getHeldTimestamp() {
+ return $this->heldTimestamp;
+ }
+
+ public function getHandlingUser() {
+ return $this->user;
+ }
+
+ public function getHandlingComment() {
+ return $this->comment;
+ }
+
+ public function insertOn() {
+ $dbw = wfGetDB( DB_MASTER );
+ # Allow for some fields to be handled automatically...
+ $acr_id = is_null( $this->id )
+ ? $this->id
+ : $dbw->nextSequenceValue(
'account_requests_acr_id_seq' );
+ # Insert into pending requests...
+ $dbw->insert( 'account_requests',
+ array(
+ 'acr_id' => $acr_id,
+ 'acr_name' => strval(
$this->name ),
+ 'acr_email' => strval( $this->email
),
+ 'acr_real_name' => strval(
$this->realName ),
+ 'acr_registration' => $dbw->timestamp(
$this->registration ),
+ 'acr_bio' => strval(
$this->bio ),
+ 'acr_notes' => strval( $this->notes
),
+ 'acr_urls' => strval(
$this->urls ),
+ 'acr_type' => strval(
$this->type ),
+ 'acr_areas' => self::flattenAreas(
$this->areas ),
+ 'acr_filename' => isset(
$this->fileName )
+ ? $this->fileName
+ : null,
+ 'acr_storage_key' => isset(
$this->fileStorageKey )
+ ? $this->fileStorageKey
+ : null,
+ 'acr_comment' => strval(
$this->comment ),
+ 'acr_ip' => strval(
$this->ip ), // possible use for spam blocking
+ 'acr_deleted' => (int)$this->deleted,
+ 'acr_email_token' => strval(
$this->emailToken ), // MD5 of token
+ 'acr_email_token_expires' => $dbw->timestamp(
$this->emailTokenExpires ),
+ ),
+ __METHOD__
+ );
+ $this->id = $acr_id; // set for accessors
+
+ return $this->id;
+ }
+
+ public function remove() {
+ if ( !$this->id ) {
+ throw new MWException( "Account request ID is not set."
);
+ }
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'account_requests', array( 'acr_id' => $this->id
), __METHOD__ );
+
+ return ( $dbw->affectedRows() > 0 );
+ }
+
+ /**
+ * Flatten areas of interest array
+ * Used by ConfirmAccountsPage
+ * @todo just serialize()
+ */
+ protected static function flattenAreas( array $areas ) {
+ $flatAreas = '';
+ foreach ( $areas as $area ) {
+ $flatAreas .= $area . "\n";
+ }
+ return $flatAreas;
+ }
+
+ /**
+ * Expand areas of interest to array
+ * Used by ConfirmAccountsPage
+ * @todo just unserialize()
+ */
+ public static function expandAreas( $areas ) {
+ $list = explode( "\n", $areas );
+ foreach ( $list as $n => $item ) {
+ $list[$n] = trim( "wpArea-" . str_replace( ' ', '_',
$item ) );
+ }
+ unset( $list[count( $list ) - 1] );
+ return $list;
+ }
+}
Property changes on:
trunk/extensions/ConfirmAccount/dataclasses/UserAccountRequest.php
___________________________________________________________________
Added: svn:eol-style
+ native
Modified:
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/ConfirmAccount_body.php
===================================================================
---
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/ConfirmAccount_body.php
2011-09-26 02:04:17 UTC (rev 98103)
+++
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/ConfirmAccount_body.php
2011-09-26 02:07:32 UTC (rev 98104)
@@ -754,7 +754,7 @@
$this->mUsername = $this->mUsername ? $this->mUsername
: $row->acr_name;
$this->mBio = $this->mBio ? $this->mBio : $row->acr_bio;
$this->mType = !is_null($this->mType) ? $this->mType :
$row->acr_type;
- $rowareas = RequestAccountPage::expandAreas(
$row->acr_areas );
+ $rowareas = UserAccountRequest::expandAreas(
$row->acr_areas );
foreach( $this->mAreas as $area => $within ) {
# If admin didn't set any of these checks, go
back to how the user set them
Modified:
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/RequestAccount_body.php
===================================================================
---
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/RequestAccount_body.php
2011-09-26 02:04:17 UTC (rev 98103)
+++
trunk/extensions/ConfirmAccount/presentation/specialpages/actions/RequestAccount_body.php
2011-09-26 02:07:32 UTC (rev 98104)
@@ -335,7 +335,7 @@
$this->showForm( wfMsgHtml(
'requestaccount-exts' ) );
return false;
}
- $veri = $this->verify( $this->mTempPath, $finalExt );
+ $veri = ConfirmAccount::verifyAttachment(
$this->mTempPath, $finalExt );
if ( !$veri->isGood() ) {
$this->mPrevAttachment = '';
$this->showForm( wfMsgHtml( 'uploadcorrupt' ) );
@@ -352,30 +352,25 @@
$expires = null; // passed by reference
$token = ConfirmAccount::getConfirmationToken( $u, $expires );
# Insert into pending requests...
- $acr_id = $dbw->nextSequenceValue(
'account_requests_acr_id_seq' );
+ $req = UserAccountRequest::newFromArray( array(
+ 'name' => $u->getName(),
+ 'email' => $u->getEmail(),
+ 'real_name' => $u->getRealName(),
+ 'registration' => wfTimestampNow(),
+ 'bio' => $this->mBio,
+ 'notes' => $this->mNotes,
+ 'urls' => $this->mUrls,
+ 'filename' => isset( $this->mSrcName ) ?
$this->mSrcName : null,
+ 'type' => $this->mType,
+ 'areas' => $this->mAreaSet,
+ 'storage_key' => isset( $key ) ? $key : null,
+ 'comment' => '',
+ 'email_token' => md5( $token ),
+ 'email_token_expires' => $expires,
+ 'ip' => wfGetIP(),
+ ) );
$dbw->begin();
- $dbw->insert( 'account_requests',
- array(
- 'acr_id' => $acr_id,
- 'acr_name' => $u->getName(),
- 'acr_email' => $u->getEmail(),
- 'acr_real_name' => $u->getRealName(),
- 'acr_registration' => $dbw->timestamp(),
- 'acr_bio' => $this->mBio,
- 'acr_notes' => $this->mNotes,
- 'acr_urls' => $this->mUrls,
- 'acr_filename' => isset( $this->mSrcName ) ?
$this->mSrcName : null,
- 'acr_type' => $this->mType,
- 'acr_areas' => self::flattenAreas(
$this->mAreaSet ),
- 'acr_storage_key' => isset( $key ) ? $key :
null,
- 'acr_comment' => '',
- 'acr_email_token' => md5( $token ),
- 'acr_email_token_expires' => $dbw->timestamp(
$expires ),
- 'acr_ip' => wfGetIP(), // Possible use for spam
blocking
- 'acr_deleted' => 0,
- ),
- __METHOD__
- );
+ $req->insertOn();
# Send confirmation, required!
$result = $this->sendConfirmationMail( $u, $token, $expires );
if ( !$result->isOK() ) {
@@ -409,30 +404,6 @@
}
/**
- * Flatten areas of interest array
- */
- protected static function flattenAreas( $areas ) {
- $flatAreas = '';
- foreach ( $areas as $area ) {
- $flatAreas .= $area . "\n";
- }
- return $flatAreas;
- }
-
- /**
- * Expand areas of interest to array
- * Used by ConfirmAccountsPage
- */
- public static function expandAreas( $areas ) {
- $list = explode( "\n", $areas );
- foreach ( $list as $n => $item ) {
- $list[$n] = trim( "wpArea-" . str_replace( ' ', '_',
$item ) );
- }
- unset( $list[count( $list ) - 1] );
- return $list;
- }
-
- /**
* Initialize the uploaded file from PHP data
*/
protected function initializeUpload( $request ) {
@@ -443,49 +414,6 @@
}
/**
- * Verifies that it's ok to include the uploaded file
- *
- * @param string $tmpfile the full path of the temporary file to verify
- * @param string $extension The filename extension that the file is to
be served with
- * @return Status object
- */
- protected function verify( $tmpfile, $extension ) {
- # magically determine mime type
- $magic =& MimeMagic::singleton();
- $mime = $magic->guessMimeType( $tmpfile, false );
- # check mime type, if desired
- global $wgVerifyMimeType;
- if ( $wgVerifyMimeType ) {
- wfDebug ( "\n\nmime: <$mime> extension:
<$extension>\n\n" );
- # check mime type against file extension
- if ( !UploadBase::verifyExtension( $mime, $extension )
) {
- return Status::newFatal( 'uploadcorrupt' );
- }
-
- # check mime type blacklist
- global $wgMimeTypeBlacklist;
- if ( isset( $wgMimeTypeBlacklist ) && !is_null(
$wgMimeTypeBlacklist )
- && $this->checkFileExtension( $mime,
$wgMimeTypeBlacklist ) ) {
- return Status::newFatal( 'filetype-badmime',
$mime );
- }
- }
- wfDebug( __METHOD__ . ": all clear; passing.\n" );
- return Status::newGood();
- }
-
- /**
- * Perform case-insensitive match against a list of file extensions.
- * Returns true if the extension is in the list.
- *
- * @param string $ext
- * @param array $list
- * @return bool
- */
- protected function checkFileExtension( $ext, $list ) {
- return in_array( strtolower( $ext ), $list );
- }
-
- /**
* @private
* @param int $limit number of accounts allowed to be requested from
the same IP
*/
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs