Tweak for r39314: don't add a line break before the "Go" button on the watchlist...
[lhc/web/wiklou.git] / includes / UserMailer.php
index 6bf322f..ad550dc 100644 (file)
@@ -29,8 +29,8 @@
  */
 class MailAddress {
        /**
-        * @param mixed $address String with an email address, or a User object
-        * @param string $name Human-readable name if a string address is given
+        * @param $address Mixed: string with an email address, or a User object
+        * @param $name String: human-readable name if a string address is given
         */
        function __construct( $address, $name=null ) {
                if( is_object( $address ) && $address instanceof User ) {
@@ -126,10 +126,12 @@ class UserMailer {
 
                        $headers['From'] = $from->toString();
 
-                       if ($wgEnotifImpersonal)
+                       if ($wgEnotifImpersonal) {
                                $headers['To'] = 'undisclosed-recipients:;';
-                       else
-                               $headers['To'] = $to->toString();
+                       }
+                       else {
+                               $headers['To'] = implode( ", ", (array )$dest );
+                       }
 
                        if ( $replyto ) {
                                $headers['Reply-To'] = $replyto->toString();
@@ -160,7 +162,7 @@ class UserMailer {
                        # 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 );
@@ -263,7 +265,7 @@ class EmailNotification {
        /**@}}*/
 
        /**
-        * 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.
@@ -277,13 +279,14 @@ class EmailNotification {
         */
        function notifyOnPageChange($editor, $title, $timestamp, $summary, $minorEdit, $oldid = false) {
                global $wgEnotifUseJobQ;
-       
+
                if( $title->getNamespace() < 0 )
                        return;
 
                if ($wgEnotifUseJobQ) {
                        $params = array(
                                "editor" => $editor->getName(),
+                               "editorID" => $editor->getID(),
                                "timestamp" => $timestamp,
                                "summary" => $summary,
                                "minorEdit" => $minorEdit,
@@ -297,9 +300,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
@@ -311,7 +314,7 @@ class EmailNotification {
         */
        function actuallyNotifyOnPageChange($editor, $title, $timestamp, $summary, $minorEdit, $oldid=false) {
 
-               # we use $wgEmergencyContact as sender's address
+               # we use $wgPasswordSender as sender's address
                global $wgEnotifWatchlist;
                global $wgEnotifMinorEdits, $wgEnotifUserTalk, $wgShowUpdatedMarker;
                global $wgEnotifImpersonal;
@@ -344,37 +347,44 @@ class EmailNotification {
                                } elseif ( $targetUser->getId() == $editor->getId() ) {
                                        wfDebug( __METHOD__.": user edited their own talk page, no notification sent\n" );
                                } elseif( $targetUser->getOption( 'enotifusertalkpages' ) ) {
-                                       wfDebug( __METHOD__.": sending talk page update notification\n" );
-                                       $this->compose( $targetUser );
-                                       $userTalkId = $targetUser->getId();
+                                       if( $targetUser->isEmailConfirmed() ) {
+                                               wfDebug( __METHOD__.": sending talk page update notification\n" );
+                                               $this->compose( $targetUser );
+                                               $userTalkId = $targetUser->getId();
+                                       } else {
+                                               wfDebug( __METHOD__.": talk page owner doesn't have validated email\n" );
+                                       }
                                } else {
                                        wfDebug( __METHOD__.": talk page owner doesn't want notifications\n" );
                                }
                        }
 
-
                        if ( $wgEnotifWatchlist ) {
                                // Send updates to watchers other than the current editor
-                               $userCondition = 'wl_user <> ' . intval( $editor->getId() );
+                               $userCondition = 'wl_user != ' . $editor->getID();
                                if ( $userTalkId !== false ) {
-                                       // Already sent an email to this person 
-                                       $userCondition .= ' AND wl_user <> ' . intval( $userTalkId );
+                                       // 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 );
                                        }
@@ -391,8 +401,9 @@ class EmailNotification {
                $this->sendMails();
 
                if ( $wgShowUpdatedMarker || $wgEnotifWatchlist ) {
-                       # mark the changed watch-listed page with a timestamp, so that the page is
-                       # listed with an "updated since your last visit" icon in the watch list, ...
+                       # Mark the changed watch-listed page with a timestamp, so that the page is
+                       # listed with an "updated since your last visit" icon in the watch list. Do
+                       # not do this to users for their own edits.
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'watchlist',
                                array( /* SET */
@@ -400,7 +411,8 @@ class EmailNotification {
                                ), array( /* WHERE */
                                        'wl_title' => $title->getDBkey(),
                                        'wl_namespace' => $title->getNamespace(),
-                                       'wl_notificationtimestamp IS NULL'
+                                       'wl_notificationtimestamp IS NULL',
+                                       'wl_user != ' . $editor->getID()
                                ), __METHOD__
                        );
                }
@@ -412,7 +424,7 @@ class EmailNotification {
         * @private
         */
        function composeCommonMailtext() {
-               global $wgEmergencyContact, $wgNoReplyAddress;
+               global $wgPasswordSender, $wgNoReplyAddress;
                global $wgEnotifFromEditor, $wgEnotifRevealEditorAddress;
                global $wgEnotifImpersonal;
 
@@ -448,7 +460,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',
@@ -469,7 +481,7 @@ class EmailNotification {
                # global configuration level.
                $editor = $this->editor;
                $name    = $editor->getName();
-               $adminAddress = new MailAddress( $wgEmergencyContact, 'WikiAdmin' );
+               $adminAddress = new MailAddress( $wgPasswordSender, 'WikiAdmin' );
                $editorAddress = new MailAddress( $editor );
                if( $wgEnotifRevealEditorAddress
                    && ( $editor->getEmail() != '' )
@@ -569,7 +581,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 ) {
@@ -584,7 +596,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);
        }
 
@@ -596,6 +608,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 );
 }