]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/mail.php
Merge branch 'nightly' into 'nightly'
[quix0rs-gnu-social.git] / lib / mail.php
index c93464a58682f33ac1a64255b4c49885c44518f5..497637eb444b9379125406f212213f2193728a4e 100644 (file)
@@ -30,9 +30,7 @@
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 require_once 'Mail.php';
 
@@ -47,14 +45,14 @@ require_once 'Mail.php';
 function mail_backend()
 {
     static $backend = null;
+    global $_PEAR;
 
     if (!$backend) {
-        $backend = Mail::factory(common_config('mail', 'backend'),
-                                 (common_config('mail', 'params')) ?
-                                 common_config('mail', 'params') :
-                                 array());
-        if (PEAR::isError($backend)) {
-            common_server_error($backend->getMessage(), 500);
+        $mail = new Mail();
+        $backend = $mail->factory(common_config('mail', 'backend'),
+                                 common_config('mail', 'params') ?: array());
+        if ($_PEAR->isError($backend)) {
+            throw new EmailException($backend->getMessage(), $backend->getCode());
         }
     }
     return $backend;
@@ -71,6 +69,8 @@ function mail_backend()
  */
 function mail_send($recipients, $headers, $body)
 {
+    global $_PEAR;
+
     try {
         // XXX: use Mail_Queue... maybe
         $backend = mail_backend();
@@ -81,6 +81,9 @@ function mail_send($recipients, $headers, $body)
 
         assert($backend); // throws an error if it's bad
         $sent = $backend->send($recipients, $headers, $body);
+        if ($_PEAR->isError($sent)) {
+            throw new EmailException($sent->getMessage(), $sent->getCode());
+        }
         return true;
     } catch (PEAR_Exception $e) {
         common_log(
@@ -141,7 +144,7 @@ function mail_notify_from()
  *
  * @return boolean success flag
  */
-function mail_to_user(&$user, $subject, $body, $headers=array(), $address=null)
+function mail_to_user($user, $subject, $body, $headers=array(), $address=null)
 {
     if (!$address) {
         $address = $user->email;
@@ -150,6 +153,7 @@ function mail_to_user(&$user, $subject, $body, $headers=array(), $address=null)
     $recipients = $address;
     $profile    = $user->getProfile();
 
+    $headers['Date']    = date("r", time());
     $headers['From']    = mail_notify_from();
     $headers['To']      = $profile->getBestName() . ' <' . $address . '>';
     $headers['Subject'] = $subject;
@@ -157,45 +161,6 @@ function mail_to_user(&$user, $subject, $body, $headers=array(), $address=null)
     return mail_send($recipients, $headers, $body);
 }
 
-/**
- * Send an email to confirm a user's control of an email address
- *
- * @param User   $user     User claiming the email address
- * @param string $code     Confirmation code
- * @param string $nickname Nickname of user
- * @param string $address  email address to confirm
- *
- * @see common_confirmation_code()
- *
- * @return success flag
- */
-function mail_confirm_address($user, $code, $nickname, $address, $url=null)
-{
-    if (empty($url)) {
-        $url = common_local_url('confirmaddress', array('code' => $code));
-    }
-
-    // TRANS: Subject for address confirmation email.
-    $subject = _('Email address confirmation');
-
-    // TRANS: Body for address confirmation email.
-    // TRANS: %1$s is the addressed user's nickname, %2$s is the StatusNet sitename,
-    // TRANS: %3$s is the URL to confirm at.
-    $body = sprintf(_("Hey, %1\$s.\n\n".
-                      "Someone just entered this email address on %2\$s.\n\n" .
-                      "If it was you, and you want to confirm your entry, ".
-                      "use the URL below:\n\n\t%3\$s\n\n" .
-                      "If not, just ignore this message.\n\n".
-                      "Thanks for your time, \n%2\$s\n"),
-                    $nickname,
-                    common_config('site', 'name'),
-                    $url);
-
-    $headers = array();
-
-    return mail_to_user($user, $subject, $body, $headers, $address);
-}
-
 /**
  * notify a user of subscription by another user
  *
@@ -234,8 +199,7 @@ function mail_subscribe_notify_profile($listenee, $other)
 
         $name = $profile->getBestName();
 
-        $long_name = ($other->fullname) ?
-          ($other->fullname . ' (' . $other->nickname . ')') : $other->nickname;
+        $long_name = $other->getFancyName();
 
         $recipients = $listenee->email;
 
@@ -439,14 +403,26 @@ function mail_broadcast_notice_sms($notice)
     $user = new User();
 
     $UT = common_config('db','type')=='pgsql'?'"user"':'user';
+    $replies = $notice->getReplies();
     $user->query('SELECT nickname, smsemail, incomingemail ' .
-                 "FROM $UT JOIN subscription " .
+                 "FROM $UT LEFT OUTER JOIN subscription " .
                  "ON $UT.id = subscription.subscriber " .
-                 'WHERE subscription.subscribed = ' . $notice->profile_id . ' ' .
+                 'AND subscription.subscribed = ' . $notice->profile_id . ' ' .
                  'AND subscription.subscribed != subscription.subscriber ' .
+                 // Users (other than the sender) who `want SMS notices':
+                 "WHERE $UT.id != " . $notice->profile_id . ' ' .
                  "AND $UT.smsemail IS NOT null " .
                  "AND $UT.smsnotify = 1 " .
-                 'AND subscription.sms = 1 ');
+                 // ... where either the user _is_ subscribed to the sender
+                 // (any of the "subscription" fields IS NOT null)
+                 // and wants to get SMS for all of this scribe's notices...
+                 'AND (subscription.sms = 1 ' .
+                 // ... or where the user was mentioned in
+                 // or replied-to with the notice:
+                 ($replies ? sprintf("OR $UT.id in (%s)",
+                                     implode(',', $replies))
+                           : '') .
+                 ')');
 
     while ($user->fetch()) {
         common_log(LOG_INFO,
@@ -609,11 +585,11 @@ function mail_notify_nudge($from, $to)
 function mail_notify_message($message, $from=null, $to=null)
 {
     if (is_null($from)) {
-        $from = User::staticGet('id', $message->from_profile);
+        $from = User::getKV('id', $message->from_profile);
     }
 
     if (is_null($to)) {
-        $to = User::staticGet('id', $message->to_profile);
+        $to = User::getKV('id', $message->to_profile);
     }
 
     if (is_null($to->email) || !$to->emailnotifymsg) {
@@ -650,99 +626,44 @@ function mail_notify_message($message, $from=null, $to=null)
 }
 
 /**
- * Notify a user that one of their notices has been chosen as a 'fave'
- *
- * Doesn't check that the user has an email address nor if they
- * want to receive notification of faves. Maybe this happens higher
- * up the stack...?
+ * Notify a user that they have received an "attn:" message AKA "@-reply"
  *
- * @param User   $other  The user whose notice was faved
- * @param User   $user   The user who faved the notice
- * @param Notice $notice The notice that was faved
+ * @param Profile $rcpt  The Profile who recevied the notice, should be a local user
+ * @param Notice $notice The notice that was sent
  *
  * @return void
  */
-function mail_notify_fave($other, $user, $notice)
+function mail_notify_attn(Profile $rcpt, Notice $notice)
 {
-    if (!$user->hasRight(Right::EMAILONFAVE)) {
+    if (!$rcpt->isLocal()) {
         return;
     }
 
-    $profile = $user->getProfile();
-    if ($other->hasBlocked($profile)) {
-        // If the author has blocked us, don't spam them with a notification.
+    $sender = $notice->getProfile();
+    if ($rcpt->sameAs($sender)) {
         return;
     }
 
-    $bestname = $profile->getBestName();
-
-    common_switch_locale($other->language);
-
-    // TRANS: Subject for favorite notification e-mail.
-    // TRANS: %1$s is the adding user's long name, %2$s is the adding user's nickname.
-    $subject = sprintf(_('%1$s (@%2$s) added your notice as a favorite'), $bestname, $user->nickname);
-
-    // TRANS: Body for favorite notification e-mail.
-    // TRANS: %1$s is the adding user's long name, $2$s is the date the notice was created,
-    // TRANS: %3$s is a URL to the faved notice, %4$s is the faved notice text,
-    // TRANS: %5$s is a URL to all faves of the adding user, %6$s is the StatusNet sitename,
-    // TRANS: %7$s is the adding user's nickname.
-    $body = sprintf(_("%1\$s (@%7\$s) just added your notice from %2\$s".
-                      " as one of their favorites.\n\n" .
-                      "The URL of your notice is:\n\n" .
-                      "%3\$s\n\n" .
-                      "The text of your notice is:\n\n" .
-                      "%4\$s\n\n" .
-                      "You can see the list of %1\$s's favorites here:\n\n" .
-                      "%5\$s"),
-                    $bestname,
-                    common_exact_date($notice->created),
-                    common_local_url('shownotice',
-                                     array('notice' => $notice->id)),
-                    $notice->content,
-                    common_local_url('showfavorites',
-                                     array('nickname' => $user->nickname)),
-                    common_config('site', 'name'),
-                    $user->nickname) .
-            mail_footer_block();
-
-    $headers = _mail_prepare_headers('fave', $other->nickname, $user->nickname);
-
-    common_switch_locale();
-    mail_to_user($other, $subject, $body, $headers);
-}
-
-/**
- * Notify a user that they have received an "attn:" message AKA "@-reply"
- *
- * @param User   $user   The user who recevied the notice
- * @param Notice $notice The notice that was sent
- *
- * @return void
- */
-function mail_notify_attn($user, $notice)
-{
-    if (!$user->email || !$user->emailnotifyattn) {
+    // See if the notice's author who mentions this user is sandboxed
+    if (!$sender->hasRight(Right::EMAILONREPLY)) {
         return;
     }
 
-    $sender = $notice->getProfile();
-
-    if ($sender->id == $user->id) {
+    // If the author has blocked the author, don't spam them with a notification.
+    if ($rcpt->hasBlocked($sender)) {
         return;
     }
 
-    if (!$sender->hasRight(Right::EMAILONREPLY)) {
+    $user = $rcpt->getUser();
+    if (!$user->receivesEmailNotifications()) {
         return;
     }
 
-    $bestname = $sender->getBestName();
-
     common_switch_locale($user->language);
 
     if ($notice->hasConversation()) {
         $conversationUrl = common_local_url('conversation',
-                         array('id' => $notice->conversation)).'#notice-'.$notice->id;
+                         array('id' => $notice->conversation)).'#notice-'.$notice->getID();
         // TRANS: Line in @-reply notification e-mail. %s is conversation URL.
         $conversationEmailText = sprintf(_("The full conversation can be read here:\n\n".
                                            "\t%s"), $conversationUrl) . "\n\n";
@@ -751,8 +672,8 @@ function mail_notify_attn($user, $notice)
     }
 
     // TRANS: E-mail subject for notice notification.
-    // TRANS: %1$s is the sending user's long name, %2$s is the adding user's nickname.
-    $subject = sprintf(_('%1$s (@%2$s) sent a notice to your attention'), $bestname, $sender->nickname);
+    // TRANS: %1$s is the "fancy name" for a profile.
+    $subject = sprintf(_('%1$s sent a notice to your attention'), $sender->getFancyName());
 
         // TRANS: Body of @-reply notification e-mail.
         // TRANS: %1$s is the sending user's name, $2$s is the StatusNet sitename,
@@ -772,15 +693,15 @@ function mail_notify_attn($user, $notice)
                     $sender->getFancyName(),//%1
                     common_config('site', 'name'),//%2
                     common_local_url('shownotice',
-                                     array('notice' => $notice->id)),//%3
-                    $notice->content,//%4
+                                     array('notice' => $notice->getID())),//%3
+                    $notice->getContent(),//%4
                     $conversationEmailText,//%5
                     common_local_url('newnotice',
-                                     array('replyto' => $sender->nickname, 'inreplyto' => $notice->id)),//%6
+                                     array('replyto' => $sender->getNickname(), 'inreplyto' => $notice->getID())),//%6
                     common_local_url('replies',
-                                     array('nickname' => $user->nickname))) . //%7
+                                     array('nickname' => $rcpt->getNickname()))) . //%7
                 mail_footer_block();
-    $headers = _mail_prepare_headers('mention', $user->nickname, $sender->nickname);
+    $headers = _mail_prepare_headers('mention', $rcpt->getNickname(), $sender->getNickname());
 
     common_switch_locale();
     mail_to_user($user, $subject, $body, $headers);
@@ -819,7 +740,7 @@ function mail_notify_group_join($group, $joiner)
     $admin = $group->getAdmins();
     while ($admin->fetch()) {
         // We need a local user for email notifications...
-        $adminUser = User::staticGet('id', $admin->id);
+        $adminUser = User::getKV('id', $admin->id);
         // @fixme check for email preference?
         if ($adminUser && $adminUser->email) {
             // use the recipient's localization
@@ -831,7 +752,7 @@ function mail_notify_group_join($group, $joiner)
             // TRANS: Subject of group join notification e-mail.
             // TRANS: %1$s is the joining user's nickname, %2$s is the group name, and %3$s is the StatusNet sitename.
             $headers['Subject'] = sprintf(_('%1$s has joined '.
-                                            'your group %2$s on %3$s.'),
+                                            'your group %2$s on %3$s'),
                                           $joiner->getBestName(),
                                           $group->getBestName(),
                                           common_config('site', 'name'));
@@ -866,7 +787,7 @@ function mail_notify_group_join_pending($group, $joiner)
     $admin = $group->getAdmins();
     while ($admin->fetch()) {
         // We need a local user for email notifications...
-        $adminUser = User::staticGet('id', $admin->id);
+        $adminUser = User::getKV('id', $admin->id);
         // @fixme check for email preference?
         if ($adminUser && $adminUser->email) {
             // use the recipient's localization