Revert r34906, r34907, r34928 -- mixing high-level data into low-level storage functi...
[lhc/web/wiklou.git] / includes / UserMailer.php
index 19a4728..cee1cc8 100644 (file)
@@ -52,7 +52,7 @@ class MailAddress {
                # so don't bother generating them
                if( $this->name != '' && !wfIsWindows() ) {
                        $quoted = wfQuotedPrintable( $this->name );
-                       if( strpos( $quoted, '.' ) !== false ) {
+                       if( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
                                $quoted = '"' . $quoted . '"';
                        }
                        return "$quoted <{$this->address}>";
@@ -76,17 +76,14 @@ class UserMailer {
         */
        protected static function sendWithPear($mailer, $dest, $headers, $body)
        {
-               $mailResult =& $mailer->send($dest, $headers, $body);
+               $mailResult = $mailer->send($dest, $headers, $body);
 
                # Based on the result return an error string,
-               if ($mailResult === true) {
-                       return '';
-               } elseif (is_object($mailResult)) {
+               if( PEAR::isError( $mailResult ) ) {
                        wfDebug( "PEAR::Mail failed: " . $mailResult->getMessage() . "\n" );
-                       return $mailResult->getMessage();
+                       return new WikiError( $mailResult->getMessage() );
                } else {
-                       wfDebug( "PEAR::Mail failed, unknown error result\n" );
-                       return 'Mail object return unknown error.';
+                       return true;
                }
        }
 
@@ -101,6 +98,7 @@ class UserMailer {
         * @param $subject String: email's subject.
         * @param $body String: email's text.
         * @param $replyto String: optional reply-to email (default: null).
+        * @return mixed True on success, a WikiError object on failure.
         */
        static function send( $to, $from, $subject, $body, $replyto=null ) {
                global $wgSMTP, $wgOutputEncoding, $wgErrorString, $wgEnotifImpersonal;
@@ -148,25 +146,21 @@ class UserMailer {
                        $mail_object =& Mail::factory('smtp', $wgSMTP);
                        if( PEAR::isError( $mail_object ) ) {
                                wfDebug( "PEAR::Mail factory failed: " . $mail_object->getMessage() . "\n" );
-                               return $mail_object->getMessage();
+                               return new WikiError( $mail_object->getMessage() );
                        }
 
                        wfDebug( "Sending mail via PEAR::Mail to $dest\n" );
-                       if (is_array($dest)) {
-                               $chunks = array_chunk($dest, $wgEnotifMaxRecips);
-                               foreach ($chunks as $chunk) {
-                                       $e = self::sendWithPear($mail_object, $chunk, $headers, $body);
-                                       if ($e != '')
-                                               return $e;
-                               }
-                       } else
-                               return $mail_object->send($dest, $headers, $body);
-
+                       $chunks = array_chunk( (array)$dest, $wgEnotifMaxRecips );
+                       foreach ($chunks as $chunk) {
+                               $e = self::sendWithPear($mail_object, $chunk, $headers, $body);
+                               if( WikiError::isError( $e ) )
+                                       return $e;
+                       }
                } else  {
                        # In the following $headers = expression we removed "Reply-To: {$from}\r\n" , because it is treated differently
                        # (fifth parameter of the PHP mail function, see some lines below)
 
-                       # Line endings need to be different on Unix and Windows due to 
+                       # Line endings need to be different on Unix and Windows due to
                        # the bug described at http://trac.wordpress.org/ticket/2603
                        if ( wfIsWindows() ) {
                                $body = str_replace( "\n", "\r\n", $body );
@@ -207,13 +201,13 @@ class UserMailer {
 
                        if ( $wgErrorString ) {
                                wfDebug( "Error sending mail: $wgErrorString\n" );
-                               return $wgErrorString;
+                               return new WikiError( $wgErrorString );
                        } elseif (! $sent) {
                                //mail function only tells if there's an error
                                wfDebug( "Error sending mail\n" );
-                               return 'mailer error';
+                               return new WikiError( 'mailer error' );
                        } else {
-                               return '';
+                               return true;
                        }
                }
        }
@@ -263,13 +257,13 @@ class EmailNotification {
         * @private
         */
        var $to, $subject, $body, $replyto, $from;
-       var $user, $title, $timestamp, $summary, $minorEdit, $oldid;
+       var $user, $title, $timestamp, $summary, $minorEdit, $oldid, $composed_common, $editor;
        var $mailTargets = array();
 
        /**@}}*/
 
        /**
-        * Send emails corresponding to the user $editor editing the page $title. 
+        * Send emails corresponding to the user $editor editing the page $title.
         * Also updates wl_notificationtimestamp.
         *
         * May be deferred via the job queue.
@@ -283,7 +277,7 @@ class EmailNotification {
         */
        function notifyOnPageChange($editor, $title, $timestamp, $summary, $minorEdit, $oldid = false) {
                global $wgEnotifUseJobQ;
-       
+
                if( $title->getNamespace() < 0 )
                        return;
 
@@ -303,9 +297,9 @@ class EmailNotification {
        }
 
        /*
-        * Immediate version of notifyOnPageChange(). 
+        * Immediate version of notifyOnPageChange().
         *
-        * Send emails corresponding to the user $editor editing the page $title. 
+        * Send emails corresponding to the user $editor editing the page $title.
         * Also updates wl_notificationtimestamp.
         *
         * @param $editor User object
@@ -337,7 +331,8 @@ class EmailNotification {
                $this->summary = $summary;
                $this->minorEdit = $minorEdit;
                $this->oldid = $oldid;
-               $this->composeCommonMailtext($editor);
+               $this->editor = $editor;
+               $this->composed_common = false;
 
                $userTalkId = false;
 
@@ -362,24 +357,28 @@ class EmailNotification {
                                // Send updates to watchers other than the current editor
                                $userCondition = 'wl_user <> ' . intval( $editor->getId() );
                                if ( $userTalkId !== false ) {
-                                       // Already sent an email to this person 
+                                       // Already sent an email to this person
                                        $userCondition .= ' AND wl_user <> ' . intval( $userTalkId );
                                }
                                $dbr = wfGetDB( DB_SLAVE );
 
-                               $res = $dbr->select( 'watchlist', array( 'wl_user' ),
+                               list( $user ) = $dbr->tableNamesN( 'user' );
+
+                               $res = $dbr->select( array( 'watchlist', 'user' ),
+                                       array( "$user.*" ),
                                        array(
+                                               'wl_user=user_id',
                                                'wl_title' => $title->getDBkey(),
                                                'wl_namespace' => $title->getNamespace(),
                                                $userCondition,
                                                'wl_notificationtimestamp IS NULL',
                                        ), __METHOD__ );
+                               $userArray = UserArray::newFromResult( $res );
 
-                               foreach ( $res as $row ) {
-                                       $watchingUser = User::newFromId( $row->wl_user );
-                                       if ( $watchingUser->getOption( 'enotifwatchlistpages' ) && 
-                                               ( !$minorEdit || $watchingUser->getOption('enotifminoredits') ) && 
-                                               $watchingUser->isEmailConfirmed() ) 
+                               foreach ( $userArray as $watchingUser ) {
+                                       if ( $watchingUser->getOption( 'enotifwatchlistpages' ) &&
+                                               ( !$minorEdit || $watchingUser->getOption('enotifminoredits') ) &&
+                                               $watchingUser->isEmailConfirmed() )
                                        {
                                                $this->compose( $watchingUser );
                                        }
@@ -387,8 +386,8 @@ class EmailNotification {
                        }
                }
 
-               global $wgUsersNotifedOnAllChanges;
-               foreach ( $wgUsersNotifedOnAllChanges as $name ) {
+               global $wgUsersNotifiedOnAllChanges;
+               foreach ( $wgUsersNotifiedOnAllChanges as $name ) {
                        $user = User::newFromName( $name );
                        $this->compose( $user );
                }
@@ -416,11 +415,13 @@ class EmailNotification {
        /**
         * @private
         */
-       function composeCommonMailtext($editor) {
+       function composeCommonMailtext() {
                global $wgEmergencyContact, $wgNoReplyAddress;
                global $wgEnotifFromEditor, $wgEnotifRevealEditorAddress;
                global $wgEnotifImpersonal;
 
+               $this->composed_common = true;
+
                $summary = ($this->summary == '') ? ' - ' : $this->summary;
                $medit   = ($this->minorEdit) ? wfMsg( 'minoredit' ) : '';
 
@@ -451,7 +452,7 @@ class EmailNotification {
 
                if ($wgEnotifImpersonal && $this->oldid)
                        /*
-                        * For impersonal mail, show a diff link to the last 
+                        * For impersonal mail, show a diff link to the last
                         * revision.
                         */
                        $keys['$NEWPAGE'] = wfMsgForContent('enotif_lastdiff',
@@ -470,6 +471,7 @@ class EmailNotification {
                # Reveal the page editor's address as REPLY-TO address only if
                # the user has not opted-out and the option is enabled at the
                # global configuration level.
+               $editor = $this->editor;
                $name    = $editor->getName();
                $adminAddress = new MailAddress( $wgEmergencyContact, 'WikiAdmin' );
                $editorAddress = new MailAddress( $editor );
@@ -519,6 +521,10 @@ class EmailNotification {
         */
        function compose( $user ) {
                global $wgEnotifImpersonal;
+
+               if ( !$this->composed_common )
+                       $this->composeCommonMailtext();
+
                if ( $wgEnotifImpersonal ) {
                        $this->mailTargets[] = new MailAddress( $user );
                } else {
@@ -567,7 +573,7 @@ class EmailNotification {
        }
 
        /**
-        * Same as sendPersonalised but does impersonal mail suitable for bulk 
+        * Same as sendPersonalised but does impersonal mail suitable for bulk
         * mailing.  Takes an array of MailAddress objects.
         */
        function sendImpersonal( $addresses ) {
@@ -582,7 +588,7 @@ class EmailNotification {
                                array(  wfMsgForContent('enotif_impersonal_salutation'),
                                        $wgLang->timeanddate($this->timestamp, true, false, false)),
                                $this->body);
-               
+
                return UserMailer::send($addresses, $this->from, $this->subject, $body, $this->replyto);
        }
 
@@ -594,9 +600,7 @@ class EmailNotification {
 function wfRFC822Phrase( $s ) {
        return UserMailer::rfc822Phrase( $s );
 }
+
 function userMailer( $to, $from, $subject, $body, $replyto=null ) {
        return UserMailer::send( $to, $from, $subject, $body, $replyto );
 }
-
-
-