(only code related to the new file area)
*/
require_once 'lib/statusgruppe.inc.php';
class MessagesController extends AuthenticatedController {
protected $number_of_displayed_messages = 50;
public function before_filter(&$action, &$args)
{
parent::before_filter($action, $args);
PageLayout::setTitle(_('Nachrichten'));
PageLayout::setHelpKeyword('Basis.InteraktionNachrichten');
if (in_array($action, ['overview', 'sent'])) {
$this->tags = Message::getUserTags();
}
$this->setupSidebar($action);
}
public function overview_action($message_id = null)
{
Navigation::activateItem('/messaging/messages/inbox');
if (Request::get("read_all")) {
Message::markAllAs($GLOBALS['user']->id, 1);
PageLayout::postSuccess(_("Alle Nachrichten wurden als gelesen markiert."));
$this->redirect('messages/overview');
return;
}
if (Request::isPost()) {
$mbox = Request::option('mbox');
foreach (Request::optionArray('bulk') as $message_id) {
$this->deleteMessage($message_id, $mbox);
}
PageLayout::postSuccess(sprintf(
_('%u Nachrichten wurden gelöscht'),
count(Request::optionArray('bulk'))
));
$this->redirect($this->overviewURL());
return;
}
$this->messages = $this->getMessages(
true,
Request::int('limit', $this->number_of_displayed_messages),
Request::int('offset', 0),
Request::get('tag'),
Request::get('search')
);
$this->received = true;
$this->message_id = $message_id;
$this->settings = UserConfig::get($GLOBALS['user']->id)->MESSAGING_SETTINGS;
}
public function sent_action($message_id = null)
{
Navigation::activateItem('/messaging/messages/sent');
if (Request::isPost()) {
$mbox = Request::option('mbox');
foreach (Request::optionArray('bulk') as $message_id) {
$this->deleteMessage($message_id, $mbox);
}
PageLayout::postSuccess(sprintf(
_('%u Nachrichten wurden gelöscht'),
count(Request::optionArray('bulk'))
));
$this->redirect($this->sentURL());
return;
}
$this->messages = $this->getMessages(
false,
Request::int('limit', $this->number_of_displayed_messages),
Request::int('offset', 0),
Request::get('tag'),
Request::get('search')
);
$this->received = false;
$this->message_id = $message_id;
$this->settings = UserConfig::get($GLOBALS['user']->id)->MESSAGING_SETTINGS;
$this->render_action('overview');
return $this->messages;
}
public function more_action()
{
$messages = $this->getMessages(
Request::int("received") ? true : false,
Request::int("limit", $this->number_of_displayed_messages) + 1,
Request::int("offset", 0),
Request::get("tag"),
Request::get("search")
);
$this->output = ['messages' => [], "more" => 0];
if (count($messages) > Request::int("limit")) {
$this->output["more"] = 1;
array_pop($messages);
}
$this->settings = UserConfig::get($GLOBALS['user']->id)->MESSAGING_SETTINGS;
$template_factory = $this->get_template_factory();
foreach ($messages as $message) {
$this->output['messages'][] = $template_factory
->open("messages/_message_row.php")
->render(['message' => $message,
'controller' => $this,
'received' => (bool) Request::int("received"),
'settings' => $this->settings
]);
}
$this->render_json($this->output);
}
public function read_action($message_id, $mbox = 'rec')
{
$this->message = new Message($message_id);
if (!$this->message->permissionToRead()) {
throw new AccessDeniedException();
}
//load the message's top folder (if any):
$attachment_folder = Folder::findOneByRange_id($this->message->id);
if ($attachment_folder) {
$this->attachment_folder = $attachment_folder->getTypedFolder();
} else {
$this->attachment_folder = null;
}
PageLayout::setTitle(_('Betreff') . ': ' . $this->message['subject']);
if ($this->message['autor_id'] === $GLOBALS['user']->id) {
Navigation::activateItem('/messaging/messages/sent');
} else {
Navigation::activateItem('/messaging/messages/inbox');
}
if (Request::isXhr()) {
$this->response->add_header('X-Tags', json_encode($this->message->getTags()));
$this->response->add_header('X-All-Tags', json_encode(Message::getUserTags()));
} else {
// Try to redirect to overview of recevied/sent messages if
// controller is not called via ajax to ensure message is loaded
// in dialog.
$target = $this->message->autor_id === $GLOBALS['user']->id
? $this->url_for('messages/sent/' . $message_id)
: $this->url_for('messages/overview/' . $message_id);
PageLayout::addHeadElement('script', [], sprintf(
'jQuery(function () { %s });',
"location.href = '{$target}';"
));
}
$this->message->markAsRead($GLOBALS['user']->id);
$this->mbox = $mbox;
}
/**
* Lets the user compose a message and send it.
*/
public function write_action()
{
if ($GLOBALS['user']->perms === 'user' && !Request::option('answer_to')) {
throw new AccessDeniedException();
}
PageLayout::setTitle(_('Neue Nachricht schreiben'));
$this->to = [];
$this->answer_to = null;
$this->default_message = new Message();
$this->default_attachments = [];
//the message-ID for the new message:
$this->default_message->setId(Request::option('message_id', $this->default_message->getNewId()));
if (Request::option('message_id')) {
//add default attachments if there are any:
if ($this->default_message->attachment_folder) {
foreach ($this->default_message->attachment_folder->getTypedFolder()->getFiles() as $filetype) {
$this->default_attachments[] = [
'icon' => $filetype->getIcon('info')->asImg(['class' => 'text-bottom']),
'name' => $filetype->getFilename(),
'document_id' => $filetype->getId(),
'size' => $filetype->getSize()
];
}
}
}
//flag to determine if the message is forwarded or not:
$forward_message = false;
$quoted_message = false;
//check if a receiver is given:
if (Request::username('rec_uname')) {
$user = User::findByUsername(Request::username('rec_uname'));
if ($user) {
$this->default_message->receivers[] = MessageUser::build([
'user_id' => $user->id,
'snd_rec' => 'rec',
]);
}
}
//check if a list of receivers is given:
if (Request::getArray('rec_uname')) {
User::findEachByUsername(
function ($user) {
$this->default_message->receivers[] = MessageUser::build([
'user_id' => $user->id,
'snd_rec' => 'rec',
]);
},
Request::usernameArray('rec_uname')
);
}
//check if the message shall be sent to all members of a status group:
$group_ids = [];
if (Request::option('group_id')) {
$group_ids[] = Request::option('group_id');
} elseif (Request::submitted('group_ids')) {
$group_ids = Request::getArray('group_ids');
}
if ($group_ids) {
$this->default_message->receivers = [];
$groups = Statusgruppen::findMany($group_ids);
foreach ($groups as $group) {
// Exclude hidden course members from mails if not at least tutor
$hidden = [];
$course = Course::find($group->range_id);
if ($course && !$GLOBALS['perm']->have_studip_perm('tutor', $course->id)) {
$hidden = $course->members->findBy('visible', 'no')->pluck('user_id');
}
if ($group['range_id'] === $GLOBALS['user']->id
|| $GLOBALS['perm']->have_studip_perm('autor', $group['range_id']))
{
foreach ($group->members as $member) {
if (in_array($member->user_id, $hidden)) {
continue;
}
$user = new MessageUser();
$user->setData(['user_id' => $member['user_id'], 'snd_rec' => 'rec']);
$this->default_message->receivers->append($user);
}
}
}
}
//check if the message shall be sent to all members of an institute:
if (Request::get('inst_id') && $GLOBALS['perm']->have_studip_perm('admin', Request::get('inst_id'))) {
if (Request::get('filter') === 'inst_status') {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM user_inst
JOIN auth_user_md5 USING (user_id)
WHERE Institut_id = ? AND inst_perms = ?
ORDER BY Nachname, Vorname";
} else {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM user_inst
JOIN auth_user_md5 USING (user_id)
WHERE Institut_id = ? AND inst_perms != 'user'
ORDER BY Nachname, Vorname";
}
$this->default_message->receivers = DBManager::get()->fetchAll($query, [Request::option('inst_id'), Request::option('who')], 'MessageUser::build');
}
//check if the message shall be sent to all (or some) members of a course:
$filters = explode(',', Request::get('filter', ''));
$course = Course::find(Request::option('course_id'));
if ($filters && $course) {
$additional = '';
if ($GLOBALS['perm']->have_studip_perm('tutor', $course->id)) {
$allow_tutor_filters = true;
} elseif ($GLOBALS['perm']->have_studip_perm('user', $course->id)
&& ($course->getSemClass()['studygroup_mode'] || CourseConfig::get($course->id)->COURSE_STUDENT_MAILING)) {
$additional = " AND seminar_user.visible != 'no'";
$allow_tutor_filters = false;
} else {
throw new AccessDeniedException();
}
$this->default_message->receivers = [];
$all_recipients = [];
foreach ($filters as $filter) {
$query = '';
$params = ['course_id' => $course->id];
if (Request::get('who')) {
$params['status'] = explode(',', Request::get('who', ''));
}
if ($filter === 'all' || $filter === 'send_sms_to_all') {
if ($params['status']) {
$additional .= ' AND seminar_user.status IN ( :status )';
}
$query = "SELECT user_id, 'rec' AS snd_rec
FROM seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE Seminar_id = :course_id {$additional}
ORDER BY Nachname, Vorname";
} elseif ($filter === 'prelim' && $allow_tutor_filters) {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM admission_seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE Seminar_id = :course_id AND status = 'accepted'
ORDER BY Nachname, Vorname";
} elseif ($filter === 'awaiting' && $allow_tutor_filters) {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM admission_seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE Seminar_id = :course_id AND status = 'awaiting'
ORDER BY Nachname, Vorname";
} elseif ($filter === 'not_grouped' && $allow_tutor_filters) {
$query = "SELECT seminar_user.user_id, 'rec' as snd_rec
FROM seminar_user
JOIN auth_user_md5 USING (user_id)
LEFT JOIN statusgruppen ON range_id = seminar_id
LEFT JOIN statusgruppe_user ON statusgruppen.statusgruppe_id = statusgruppe_user.statusgruppe_id
AND seminar_user.user_id = statusgruppe_user.user_id
WHERE seminar_id = :course_id
GROUP BY seminar_user.user_id
HAVING COUNT(statusgruppe_user.statusgruppe_id) = 0
ORDER BY Nachname, Vorname";
} elseif ($filter === 'claiming' && $allow_tutor_filters) {
$cs = CourseSet::getSetForCourse($course->id);
if (is_object($cs) && !$cs->hasAlgorithmRun()) {
foreach (AdmissionPriority::getPrioritiesByCourse($cs->getId(), $course->id) as $user_id => $p) {
$all_recipients[] = MessageUser::build(['user_id' => $user_id, 'snd_rec' => 'rec']);
}
}
}
if ($query) {
$all_recipients = array_merge(
$all_recipients,
DBManager::get()->fetchAll($query, $params, 'MessageUser::build')
);
}
}
$this->default_message->receivers = $all_recipients;
}
if (Request::option('prof_id') && Request::option('deg_id') && $GLOBALS['perm']->have_perm('root')) {
$query = "SELECT DISTINCT user_id,'rec' as snd_rec
FROM user_studiengang
WHERE fach_id = ? AND abschluss_id = ?";
$this->default_message->receivers = DBManager::get()->fetchAll($query, [
Request::option('prof_id'),
Request::option('deg_id')
], 'MessageUser::build');
}
if (Request::option('sd_id') && $GLOBALS['perm']->have_perm('root')) {
$query = "SELECT DISTINCT user_id, 'rec' AS snd_rec
FROM user_studiengang
WHERE abschluss_id = ?";
$this->default_message->receivers = DBManager::get()->fetchAll($query, [
Request::option('sd_id')
], 'MessageUser::build');
}
if (Request::option('sp_id') && $GLOBALS['perm']->have_perm('root')) {
$query = "SELECT DISTINCT user_id,'rec' as snd_rec
FROM user_studiengang
WHERE fach_id = ?";
$this->default_message->receivers = DBManager::get()->fetchAll($query, [
Request::option('sp_id')
], 'MessageUser::build');
}
if (!$this->default_message->receivers->count() && !empty($_SESSION['sms_data']['p_rec'])) {
$this->default_message->receivers = DBManager::get()->fetchAll("SELECT user_id,'rec' as snd_rec FROM auth_user_md5 WHERE username IN(?) ORDER BY Nachname,Vorname", [$_SESSION['sms_data']['p_rec']], 'MessageUser::build');
unset($_SESSION['sms_data']);
}
//check if the message is a reply or if it shall be forwarded:
if (Request::option("answer_to")) {
$this->default_message->receivers = [];
$old_message = new Message(Request::option("answer_to"));
$this->default_tags = Request::get("default_tags", "");
$oldtags = $old_message->getTags($GLOBALS['user']->id);
if (count($oldtags)) {
$this->default_tags .= " ".implode(" ", $oldtags);
}
if (!$old_message->permissionToRead()) {
throw new AccessDeniedException("Message is not for you.");
}
if (!Request::get('forward')) {
//message is a reply message
if (Request::option("quote") === $old_message->getId()) {
$quoted_message = true;
$message = _(". . . ursprüngliche Nachricht . . .");
$message .= "\n" . _("Betreff") . ": " . $old_message['subject'];
$message .= "\n" . _("Datum") . ": " . strftime('%x %X', $old_message['mkdate']);
$message .= "\n" . _("Von") . ": " . get_fullname($old_message['autor_id']);
$num_recipients = $old_message->getNumRecipients();
if ($GLOBALS['user']->id == $old_message->autor_id) {
$message .= "\n" . ($num_recipients == 1 ? _('An: Eine Person') : sprintf(_('An: %d Personen'), $num_recipients));
} else {
$message .= "\n";
if($num_recipients > 1) {
$message .= sprintf(
ngettext(
'An: %1$s (und %2$d weitere/n)',
'An: %1$s (und %2$d weitere)',
$num_recipients
),
$GLOBALS['user']->getFullName(),
$num_recipients
);
} else {
$message .= sprintf(
_('An: %s'),
$GLOBALS['user']->getFullName()
);
}
}
$message .= "\n\n";
if (Studip\Markup::editorEnabled()) {
$message = Studip\Markup::markupToHtml($message, false) . Studip\Markup::markupToHtml($old_message['message']);
} else if (Studip\Markup::isHtml($old_message['message'])) {
$message .= Studip\Markup::removeHtml($old_message['message']);
} else {
$message .= $old_message['message'];
}
$this->default_message['message'] = $message;
}
$this->default_message['subject'] = mb_substr($old_message['subject'], 0, 4) === "RE: " ? $old_message['subject'] : "RE: ".$old_message['subject'];
if ($old_message['autor_id'] !== $GLOBALS['user']->id) {
$user = new MessageUser();
$user->setData(['user_id' => $old_message['autor_id'], 'snd_rec' => "rec"]);
$this->default_message->receivers[] = $user;
} else {
foreach ($old_message->receivers as $old_receivers) {
$user = new MessageUser();
$user->setData(['user_id' => $old_receivers['user_id'], 'snd_rec' => "rec"]);
$this->default_message->receivers[] = $user;
}
}
$this->answer_to = $old_message->id;
} else {
//message shall be forwarded
$forward_message = true;
$messagesubject = 'FWD: ' . $old_message['subject'];
$message = _(". . . weitergeleitete Nachricht . . .");
$message .= "\n" . _("Betreff") . ": " . $old_message['subject'];
$message .= "\n" . _("Datum") . ": " . strftime('%x %X', $old_message['mkdate']);
$message .= "\n" . _("Von") . ": " . get_fullname($old_message['autor_id']);
$num_recipients = $old_message->getNumRecipients();
if ($GLOBALS['user']->id == $old_message->autor_id) {
$message .= "\n" . ($num_recipients == 1 ? _('An: Eine Person') : sprintf(_('An: %d Personen'), $num_recipients));
} else {
$message .= "\n";
if($num_recipients > 1) {
$message .= sprintf(
ngettext(
'An: %1$s (und %2$d weitere/n)',
'An: %1$s (und %2$d weitere)',
$num_recipients
),
$GLOBALS['user']->getFullName(),
$num_recipients
);
} else {
$message .= sprintf(
_('An: %s'),
$GLOBALS['user']->getFullName()
);
}
}
$message .= "\n\n";
if (Studip\Markup::editorEnabled()) {
$message = Studip\Markup::markupToHtml($message, false) . Studip\Markup::markupToHtml($old_message['message']);
} else if (Studip\Markup::isHtml($old_message['message'])) {
$message .= Studip\Markup::removeHtml($old_message['message']);
} else {
$message .= $old_message['message'];
}
if ($old_message->getNumAttachments()) {
//there is at least one attachment: we must copy it
$old_attachment_folder = MessageFolder::findTopFolder($old_message->id);
if ($old_attachment_folder) {
$new_attachment_folder = MessageFolder::createTopFolder($this->default_message->id);
if ($new_attachment_folder) {
foreach ($old_attachment_folder->getFiles() as $old_attachment) {
$old_attachment_file_ref = $old_attachment->getFileRef();
$new_attachment_file_ref = new FileRef();
$new_attachment_file_ref->file_id = $old_attachment_file_ref->file_id;
$new_attachment_file_ref->name = $old_attachment_file_ref->name;
$new_attachment_file_ref->folder_id = $new_attachment_folder->getId();
$new_attachment_file_ref->description = $old_attachment_file_ref->description;
$new_attachment_file_ref->content_terms_of_use_id = $old_attachment_file_ref->content_terms_of_use_id;
$new_attachment_file_ref->user_id = $GLOBALS['user']->id;
if ($new_attachment_file_ref->store()) {
$icon = FileManager::getIconForFileRef($new_attachment_file_ref);
$this->default_attachments[] = [
'icon' => $icon->asImg(['class' => 'text-bottom']),
'name' => $new_attachment_file_ref->name,
'document_id' => $new_attachment_file_ref->id,
'size' => relsize($new_attachment_file_ref->size, false)
];
}
}
}
}
}
$this->default_message['subject'] = $messagesubject;
$this->default_message['message'] = $message;
}
}
if (Request::get('default_body')) {
if (Studip\Markup::editorEnabled()) {
$this->default_message['message'] = Studip\Markup::markupToHtml(Request::get("default_body"));
} else {
$this->default_message['message'] = Studip\Markup::removeHtml(Request::get("default_body"));
}
}
if (Request::get('default_subject')) {
$this->default_message['subject'] = Request::get("default_subject");
}
$settings = UserConfig::get($GLOBALS['user']->id)->MESSAGING_SETTINGS;
$this->mailforwarding = Request::bool('emailrequest', $settings['request_mail_forward'] ?? false);
$this->show_adressees = Request::bool('show_adressees', $settings['show_adressees'] ?? false);
if (Request::get('inst_id') || Request::get('course_id') || Request::option('group_id') || !Config::get()->SHOW_ADRESSEES_LIMIT) {
$this->show_adressees = null;
}
if (trim($settings['sms_sig'])) {
if (Studip\Markup::editorEnabled()) {
$sms_sig = Studip\Markup::markAsHtml('