diff options
| author | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2021-07-22 16:07:19 +0200 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2021-07-22 16:19:12 +0200 |
| commit | a3da1483a9e689846179159355badfec8073dbec (patch) | |
| tree | 770dcca6bdf5f6f2a11b0e7fcbbeda6919a3fc52 /lib/messaging.inc.php | |
current code from svn, revision 62608
Diffstat (limited to 'lib/messaging.inc.php')
| -rw-r--r-- | lib/messaging.inc.php | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/lib/messaging.inc.php b/lib/messaging.inc.php new file mode 100644 index 0000000..57fa314 --- /dev/null +++ b/lib/messaging.inc.php @@ -0,0 +1,418 @@ +<?php +# Lifter002: DONE - no html and mails are already templates +# Lifter003: TEST +# Lifter007: TODO +# Lifter010: DONE - not applicable +/** + * mesaging.inc.php - Funktionen fuer das Messaging + * + * several functions and classes used for the systeminternal messages + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * @author Cornelis Kater <ckater@gwdg.de> + * @author Nils K. Windisch <studip@nkwindisch.de> + * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 + * @category Stud.IP + * @package messaging + */ + +require_once 'lib/user_visible.inc.php'; + + + + +class messaging +{ + var $sig_string; //String, der Signaturen vom eigentlichen Text abgrenzt + + public static function sendSystemMessage($recipient, $message_title, $message_body) + { + $m = new messaging(); + $user = User::toObject($recipient); + return $m->insert_message($message_body, $user['username'], '____%system%____', FALSE, FALSE, '1', FALSE, $message_title); + } + + /** + * Konstruktor + */ + function __construct() + { + $this->sig_string="\n \n -- \n"; + } + + /** + * Nachricht loeschen + * + * @param $message_id + * @param $user_id + */ + function delete_message($message_id, $user_id = FALSE) + { + if (!$user_id) { + $user_id = $GLOBALS['user']->id; + } + + $query = "UPDATE message_user + SET deleted = '1' + WHERE message_id = ? AND user_id = ? AND deleted = '0'"; + + $statement = DBManager::get()->prepare($query); + $statement->execute([$message_id, $user_id]); + + if ($statement->rowCount() == 0) { + return false; + } + + $query = "SELECT 1 FROM message_user WHERE message_id = ? AND deleted = '0'"; + $statement = DBManager::get()->prepare($query); + $statement->execute([$message_id]); + if (!$statement->fetchColumn()) { + $this->remove_message($message_id); + + $folder = Folder::findOneBySQL( + "range_id = ? AND parent_id='' AND folder_type='MessageFolder'", + [$message_id] + ); + if ($folder) { + $folder->delete(); + } + } + return true; + } + + /** + * Removes a message or a list of messages from the database + * + * @param mixed $id Id(s) of the message(s) in question + * @return bool Returns false if not a single message was removed + */ + private function remove_message($id) + { + if (empty($id)) { + return true; + } + + $query = "DELETE message, message_user + FROM message + LEFT JOIN message_user USING(message_id) + WHERE message.message_id IN (?)"; + $statement = DBManager::get()->prepare($query); + $statement->execute([$id]); + return $statement->rowCount() > 0; + } + + /** + * delete all messages from user + * + * @param $user_id + */ + function delete_all_messages($user_id = FALSE) + { + if (!$user_id) { + $user_id = $GLOBALS['user']->id; + } + + $query = "SELECT message_id FROM message_user WHERE user_id = ? AND deleted = '0'"; + $statement = DBManager::get()->prepare($query); + $statement->execute([$user_id]); + $message_ids = $statement->fetchAll(PDO::FETCH_COLUMN); + + foreach ($message_ids as $message_id) { + $this->delete_message($message_id, $user_id); + } + } + + + /** + * + * @param $userid + */ + function user_wants_email($userid) + { + $query = "SELECT email_forward FROM user_info WHERE user_id = ?"; + $statement = DBManager::get()->prepare($query); + $statement->execute([$userid]); + $setting = $statement->fetchColumn(); + + if ($setting == 1) { + return false; + } + if (in_array($setting, [2, 3])) { + return $setting; + } + return $GLOBALS['MESSAGING_FORWARD_DEFAULT']; + } + + /** + * + * @param $rec_user_id + * @param $snd_user_id + * @param $message + * @param $subject + * @param $message_id + */ + function sendingEmail($rec_user_id, $snd_user_id, $message, $subject, $message_id) + { + $msg = Message::find($message_id); + $receiver = User::find($rec_user_id); + $to = $receiver->Email; + + // do not try to send mails to users without a mail address + if (!$to) { + return; + } + // do not send mails when account is locked or expired + $expiration = UserConfig::get($receiver->id)->EXPIRATION_DATE; + if ($receiver->locked || ($expiration > 0 && $expiration < time())) { + return; + } + + $rec_fullname = $receiver->getFullName(); + + setTempLanguage($rec_user_id); + + $title_prefix = Config::get()->MAIL_USE_SUBJECT_PREFIX ? '[Stud.IP - ' . Config::get()->UNI_NAME_CLEAN . '] ' : ''; + $title = $title_prefix . kill_format(str_replace(["\r", "\n"], '', $subject)); + + if ($snd_user_id != "____%system%____") { + $sender = User::find($snd_user_id); + + $snd_fullname = $sender->getFullName(); + $reply_to = $sender->Email; + } + $attachments = []; + if ($GLOBALS['ENABLE_EMAIL_ATTACHMENTS'] && $msg->attachment_folder) { + $attachments = $msg->attachment_folder->file_refs; + $size_of_attachments = array_sum($attachments->pluck('size')) ?: 0; + //assume base64 takes 33% more space + $attachments_as_links = $size_of_attachments * 1.33 > $GLOBALS['MAIL_ATTACHMENTS_MAX_SIZE'] * 1048576; //1MiB = 1024 KiB = 1048576 Bytes + } + $template = $GLOBALS['template_factory']->open('mail/text'); + $template->set_attribute('message', kill_format($message)); + $template->set_attribute('rec_fullname', $rec_fullname); + $template->set_attribute('rec_email', $to); + if (isset($snd_fullname)) { + $template->set_attribute('snd_email', $reply_to); + $template->set_attribute('snd_fullname', $snd_fullname); + } + if ($attachments_as_links) { + $template->set_attribute('attachments', $attachments); + } + $mailmessage = $template->render(); + + $template = $GLOBALS['template_factory']->open('mail/html'); + $template->set_attribute('lang', getUserLanguagePath($rec_user_id)); + $template->set_attribute('message', $message); + $template->set_attribute('rec_fullname', $rec_fullname); + $template->set_attribute('rec_email', $to); + if (isset($snd_fullname)) { + $template->set_attribute('snd_email', $reply_to); + $template->set_attribute('snd_fullname', $snd_fullname); + } + if ($attachments_as_links) { + $template->set_attribute('attachments', $attachments); + } + $mailhtml = $template->render(); + + restoreLanguage(); + + // Now, let us send the message + $mail = new StudipMail(); + $mail->setSubject($title) + ->setReplyToEmail('') + ->addRecipient($to, $rec_fullname) + ->setBodyText($mailmessage); + if (mb_strlen($reply_to)) { + if ($GLOBALS['MESSAGING_FORWARD_USE_REPLYTO']) { + $mail->setReplyToEmail($reply_to) + ->setReplyToName($snd_fullname) + ->setSenderName(sprintf(_('Stud.IP für %s'), $snd_fullname)); + } else { + $mail->setSenderEmail($reply_to) + ->setSenderName($snd_fullname) + ->setReplyToEmail(''); + } + } + $user_cfg = UserConfig::get($rec_user_id); + if ($user_cfg->getValue('MAIL_AS_HTML')) { + $mail->setBodyHtml($mailhtml); + } + + if (count($attachments) && !$attachments_as_links) { + foreach ($attachments as $attachment) { + $mail->addStudipAttachment($attachment); + } + } + if (!Config::get()->MAILQUEUE_ENABLE) { + $mail->send(); + } else { + MailQueueEntry::add($mail, $message_id, $rec_user_id); + } + } + + /** + * + * @param $message + * @param $rec_uname + * @param $user_id + * @param $time + * @param $tmp_message_id + * @param $set_deleted + * @param $signature + * @param $subject + * @param $force_email + * @param $priority + */ + function insert_message($message, $rec_uname, $user_id='', $time='', $tmp_message_id='', $set_deleted='', $signature='', $subject='', $force_email='', $priority='normal', $tags = null, $show_adressees = false) + { + // wenn keine user_id uebergeben + $user_id = $user_id ?: $GLOBALS['user']->id; + + $my_messaging_settings = UserConfig::get($user_id)->MESSAGING_SETTINGS; + + // wenn kein subject uebergeben + $subject = $subject ?: _('Ohne Betreff'); + + $email_request = $this->send_as_email ?: $my_messaging_settings['send_as_email']; + + // wenn keine zeit uebergeben + $time = $time ?: time(); + + // wenn keine id uebergeben + $tmp_message_id = $tmp_message_id ?: md5(uniqid('321losgehtes', true)); + + # send message now + if ($user_id != '____%system%____') { // real-user message + $snd_user_id = $user_id; + $set_deleted = $set_deleted ?: ($my_messaging_settings['save_snd'] != '1'); // don't save sms in outbox + + } else { // system-message + $set_deleted = '1'; + // system-signatur + $snd_user_id = '____%system%____'; + setTempLanguage(); + $message .= $this->sig_string; + $message .= _('Diese Nachricht wurde automatisch vom Stud.IP-System generiert. Sie können darauf nicht antworten.'); + + restoreLanguage(); + } + + // insert message + $query = "INSERT INTO message (message_id, autor_id, subject, message, show_adressees, priority, mkdate) + VALUES (?, ?, ?, ?, ?, ?, UNIX_TIMESTAMP())"; + $statement = DBManager::get()->prepare($query); + $statement->execute([ + $tmp_message_id, + $snd_user_id, + $subject, + $message, + (int) $show_adressees, + $priority, + ]); + // insert snd + $insert_tags = DBManager::get()->prepare(" + INSERT IGNORE INTO message_tags + SET message_id = :message_id, + user_id = :user_id, + tag = :tag, + chdate = UNIX_TIMESTAMP(), + mkdate = UNIX_TIMESTAMP() + "); + $query = "INSERT INTO message_user (message_id, user_id, snd_rec, deleted, mkdate) + VALUES (?, ?, 'snd', ?, UNIX_TIMESTAMP())"; + $statement = DBManager::get()->prepare($query); + $statement->execute([ + $tmp_message_id, + $snd_user_id, + $set_deleted ? 1 : 0, // save message? + ]); + if ($tags) { + is_array($tags) || $tags = explode(" ", (string) $tags); + foreach ($tags as $tag) { + $insert_tags->execute([ + 'message_id' => $tmp_message_id, + 'user_id' => $snd_user_id, + 'tag' => mb_strtolower($tag) + ]); + } + } + + // heben wir kein array bekommen, machen wir einfach eins ... + if (!is_array($rec_uname)) { + $rec_uname = [$rec_uname]; + } + + // wir bastelen ein neues array, das die user_id statt des user_name enthaelt + $rec_id = []; + foreach ($rec_uname as $one) { + $rec_id[] = User::findByUsername($one)->user_id; + } + $rec_id = array_filter($rec_id); + // wir gehen das eben erstellt array durch und schauen, ob irgendwer was weiterleiten moechte. + // diese user_id schreiben wir in ein tempraeres array + foreach ($rec_id as $one) { + $smsforward_rec = User::find($one)->smsforward_rec; + $tmp_forward_id = User::find($smsforward_rec)->user_id; + if ($tmp_forward_id) { + $rec_id[] = $tmp_forward_id; + } + } + + // wir mergen die eben erstellten arrays und entfernen doppelte eintraege + $rec_id = array_unique($rec_id); + + // hier gehen wir alle empfaenger durch, schreiben das in die db und schicken eine mail + $query = "INSERT INTO message_user (message_id, user_id, readed, snd_rec, mkdate) + VALUES (?, ?, ?, 'rec', UNIX_TIMESTAMP())"; + $insert = DBManager::get()->prepare($query); + $snd_name = ($user_id != '____%system%____') + ? User::find($user_id)->getFullName() . ' (' . User::find($user_id)->username . ')' + : 'Stud.IP-System'; + foreach ($rec_id as $one) { + $insert->execute([$tmp_message_id, $one, $one == $snd_user_id ? 1 : 0]); + if ($GLOBALS['MESSAGING_FORWARD_AS_EMAIL']) { + // mail to original receiver + $mailstatus_original = $this->user_wants_email($one); + if ($mailstatus_original == 2 || ($mailstatus_original == 3 && $email_request == 1) || $force_email) { + $this->sendingEmail($one, $snd_user_id, $message, $subject, $tmp_message_id); + } + } + if ($tags) { + foreach ($tags as $tag) { + $insert_tags->execute([ + 'message_id' => $tmp_message_id, + 'user_id' => $one, + 'tag' => mb_strtolower($tag) + ]); + } + } + } + + // Obtain all users that should receive a notification + $user_ids = array_diff($rec_id, [$user_id]); + + // Create notifications + foreach ($user_ids as $uid) { + setTempLanguage($uid); + + PersonalNotifications::add( + $uid, + URLHelper::getUrl("dispatch.php/messages/read/{$tmp_message_id}", [], true), + sprintf(_('Sie haben eine Nachricht von %s erhalten!'), $snd_name), + "message_{$tmp_message_id}", + Icon::create('mail'), + true + ); + } + + restoreLanguage(); + + NotificationCenter::postNotification('MessageDidSend', $tmp_message_id, compact('user_id', 'rec_id')); + + return count($rec_id); + } +} |
