diff options
Diffstat (limited to 'app/Http/Controllers/MessageController.php')
| -rw-r--r-- | app/Http/Controllers/MessageController.php | 782 |
1 files changed, 410 insertions, 372 deletions
diff --git a/app/Http/Controllers/MessageController.php b/app/Http/Controllers/MessageController.php index 7ec8df0f66..ad438c8900 100644 --- a/app/Http/Controllers/MessageController.php +++ b/app/Http/Controllers/MessageController.php @@ -32,445 +32,483 @@ use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; /** * Send messages to users and groups of users. */ -class MessageController extends AbstractBaseController { - /** - * A form to compose a message from a member. - * - * @param Request $request - * - * @return Response - */ - public function broadcastPage(Request $request): Response { - /** @var User $user */ - $user = $request->attributes->get('user'); +class MessageController extends AbstractBaseController +{ + /** + * A form to compose a message from a member. + * + * @param Request $request + * + * @return Response + */ + public function broadcastPage(Request $request): Response + { + /** @var User $user */ + $user = $request->attributes->get('user'); - $referer = $request->headers->get('referer', ''); + $referer = $request->headers->get('referer', ''); - $body = $request->get('body', ''); - $subject = $request->get('subject', ''); - $to = $request->get('to', ''); - $url = $request->get('url', $referer); + $body = $request->get('body', ''); + $subject = $request->get('subject', ''); + $to = $request->get('to', ''); + $url = $request->get('url', $referer); - $to_users = $this->recipientUsers($to); - $to_names = array_map(function (User $user) { - return $user->getRealName(); - }, $to_users); + $to_users = $this->recipientUsers($to); + $to_names = array_map(function (User $user) { + return $user->getRealName(); + }, $to_users); - $title = $this->recipientDescription($to); + $title = $this->recipientDescription($to); - $this->layout = 'layouts/administration'; + $this->layout = 'layouts/administration'; - return $this->viewResponse('broadcast-page', [ - 'body' => $body, - 'from' => $user, - 'subject' => $subject, - 'title' => $title, - 'to' => $to, - 'to_names' => $to_names, - 'url' => $url, - ]); - } + return $this->viewResponse('broadcast-page', [ + 'body' => $body, + 'from' => $user, + 'subject' => $subject, + 'title' => $title, + 'to' => $to, + 'to_names' => $to_names, + 'url' => $url, + ]); + } - /** - * Send a message. - * - * @param Request $request - * - * @return RedirectResponse - */ - public function broadcastAction(Request $request): RedirectResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * Send a message. + * + * @param Request $request + * + * @return RedirectResponse + */ + public function broadcastAction(Request $request): RedirectResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - /** @var User $user */ - $user = $request->attributes->get('user'); + /** @var User $user */ + $user = $request->attributes->get('user'); - $body = $request->get('body', ''); - $subject = $request->get('subject', ''); - $to = $request->get('to', ''); - $url = $request->get('url', ''); + $body = $request->get('body', ''); + $subject = $request->get('subject', ''); + $to = $request->get('to', ''); + $url = $request->get('url', ''); - $ip = $request->getClientIp(); - $to_users = $this->recipientUsers($to); + $ip = $request->getClientIp(); + $to_users = $this->recipientUsers($to); - if ($body === '' || $subject === '') { - return new RedirectResponse(route('broadcast', [ - 'body' => $body, - 'subject' => $subject, - 'to' => $to, - 'tree' => $tree, - 'url' => $url, - ])); - } + if ($body === '' || $subject === '') { + return new RedirectResponse(route('broadcast', [ + 'body' => $body, + 'subject' => $subject, + 'to' => $to, + 'tree' => $tree, + 'url' => $url, + ])); + } - $errors = false; + $errors = false; - foreach ($to_users as $to_user) { - if ($this->deliverMessage($tree, $user->getEmail(), $user->getRealName(), $to_user, $subject, $body, $url, $ip)) { - FlashMessages::addMessage(I18N::translate('The message was successfully sent to %s.', e($to_user->getRealName())), 'success'); - } else { - $errors = true; - } - } + foreach ($to_users as $to_user) { + if ($this->deliverMessage($tree, $user->getEmail(), $user->getRealName(), $to_user, $subject, $body, $url, $ip)) { + FlashMessages::addMessage(I18N::translate('The message was successfully sent to %s.', e($to_user->getRealName())), 'success'); + } else { + $errors = true; + } + } - if ($errors) { - FlashMessages::addMessage(I18N::translate('The message was not sent.'), 'danger'); - } + if ($errors) { + FlashMessages::addMessage(I18N::translate('The message was not sent.'), 'danger'); + } - return new RedirectResponse(route('admin-control-panel')); - } + return new RedirectResponse(route('admin-control-panel')); + } - /** - * A form to compose a message from a visitor. - * - * @param Request $request - * - * @return Response - */ - public function contactPage(Request $request): Response { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * A form to compose a message from a visitor. + * + * @param Request $request + * + * @return Response + */ + public function contactPage(Request $request): Response + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $referer = $request->headers->get('referer', ''); + $referer = $request->headers->get('referer', ''); - $body = $request->get('body', ''); - $from_email = $request->get('from_email', ''); - $from_name = $request->get('from_name', ''); - $subject = $request->get('subject', ''); - $to = $request->get('to', ''); - $url = $request->get('url', $referer); + $body = $request->get('body', ''); + $from_email = $request->get('from_email', ''); + $from_name = $request->get('from_name', ''); + $subject = $request->get('subject', ''); + $to = $request->get('to', ''); + $url = $request->get('url', $referer); - $to_user = User::findByUserName($to); + $to_user = User::findByUserName($to); - if (!in_array($to_user, $this->validContacts($tree))) { - throw new AccessDeniedHttpException('Invalid contact user id'); - } + if (!in_array($to_user, $this->validContacts($tree))) { + throw new AccessDeniedHttpException('Invalid contact user id'); + } - $to_name = $to_user->getRealName(); + $to_name = $to_user->getRealName(); - $title = I18N::translate('Send a message'); + $title = I18N::translate('Send a message'); - return $this->viewResponse('contact-page', [ - 'body' => $body, - 'from_email' => $from_email, - 'from_name' => $from_name, - 'subject' => $subject, - 'title' => $title, - 'to' => $to, - 'to_name' => $to_name, - 'url' => $url, - ]); - } + return $this->viewResponse('contact-page', [ + 'body' => $body, + 'from_email' => $from_email, + 'from_name' => $from_name, + 'subject' => $subject, + 'title' => $title, + 'to' => $to, + 'to_name' => $to_name, + 'url' => $url, + ]); + } - /** - * Send a message. - * - * @param Request $request - * - * @return RedirectResponse - */ - public function contactAction(Request $request): RedirectResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * Send a message. + * + * @param Request $request + * + * @return RedirectResponse + */ + public function contactAction(Request $request): RedirectResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $body = $request->get('body', ''); - $from_email = $request->get('from_email', ''); - $from_name = $request->get('from_name', ''); - $subject = $request->get('subject', ''); - $to = $request->get('to', ''); - $url = $request->get('url', ''); + $body = $request->get('body', ''); + $from_email = $request->get('from_email', ''); + $from_name = $request->get('from_name', ''); + $subject = $request->get('subject', ''); + $to = $request->get('to', ''); + $url = $request->get('url', ''); - $to_user = User::findByUserName($to); - $ip = $request->getClientIp(); + $to_user = User::findByUserName($to); + $ip = $request->getClientIp(); - if (!in_array($to_user, $this->validContacts($tree))) { - throw new AccessDeniedHttpException('Invalid contact user id'); - } + if (!in_array($to_user, $this->validContacts($tree))) { + throw new AccessDeniedHttpException('Invalid contact user id'); + } - $errors = $body !== '' && $subject !== '' && $from_email !== '' && $from_name !== ''; + $errors = $body !== '' && $subject !== '' && $from_email !== '' && $from_name !== ''; - if (!preg_match('/^[^@]+@([^@]+)$/', $from_email, $match) || !checkdnsrr($match[1])) { - FlashMessages::addMessage(I18N::translate('Please enter a valid email address.'), 'danger'); - $errors = true; - } + if (!preg_match('/^[^@]+@([^@]+)$/', $from_email, $match) || !checkdnsrr($match[1])) { + FlashMessages::addMessage(I18N::translate('Please enter a valid email address.'), 'danger'); + $errors = true; + } - if (preg_match('/(?!' . preg_quote(WT_BASE_URL, '/') . ')(((?:ftp|http|https):\/\/)[a-zA-Z0-9.-]+)/', $subject . $body, $match)) { - FlashMessages::addMessage(I18N::translate('You are not allowed to send messages that contain external links.') . ' ' . /* I18N: e.g. ‘You should delete the “http://” from “http://www.example.com” and try again.’ */ - I18N::translate('You should delete the “%1$s” from “%2$s” and try again.', $match[2], $match[1]), 'danger'); - $errors = true; - } + if (preg_match('/(?!' . preg_quote(WT_BASE_URL, '/') . ')(((?:ftp|http|https):\/\/)[a-zA-Z0-9.-]+)/', $subject . $body, $match)) { + FlashMessages::addMessage(I18N::translate('You are not allowed to send messages that contain external links.') . ' ' . /* I18N: e.g. ‘You should delete the “http://” from “http://www.example.com” and try again.’ */ + I18N::translate('You should delete the “%1$s” from “%2$s” and try again.', $match[2], $match[1]), 'danger'); + $errors = true; + } - if ($errors) { - return new RedirectResponse(route('contact', [ - 'body' => $body, - 'from_email' => $from_email, - 'from_name' => $from_name, - 'subject' => $subject, - 'to' => $to, - 'tree' => $tree, - 'url' => $url, - ])); - } + if ($errors) { + return new RedirectResponse(route('contact', [ + 'body' => $body, + 'from_email' => $from_email, + 'from_name' => $from_name, + 'subject' => $subject, + 'to' => $to, + 'tree' => $tree, + 'url' => $url, + ])); + } - if ($this->deliverMessage($tree, $from_email, $from_name, $to_user, $subject, $body, $url, $ip)) { - FlashMessages::addMessage(I18N::translate('The message was successfully sent to %s.', e($to_user->getRealName())), 'success'); + if ($this->deliverMessage($tree, $from_email, $from_name, $to_user, $subject, $body, $url, $ip)) { + FlashMessages::addMessage(I18N::translate('The message was successfully sent to %s.', e($to_user->getRealName())), 'success'); - $url = $url ?: route('tree-page', ['ged' => $tree->getName()]); + $url = $url ?: route('tree-page', ['ged' => $tree->getName()]); - return new RedirectResponse($url); - } else { - FlashMessages::addMessage(I18N::translate('The message was not sent.'), 'danger'); + return new RedirectResponse($url); + } else { + FlashMessages::addMessage(I18N::translate('The message was not sent.'), 'danger'); - $redirect_url = route('contact', [ - 'body' => $body, - 'from_email' => $from_email, - 'from_name' => $from_name, - 'subject' => $subject, - 'to' => $to, - 'url' => $url, - ]); + $redirect_url = route('contact', [ + 'body' => $body, + 'from_email' => $from_email, + 'from_name' => $from_name, + 'subject' => $subject, + 'to' => $to, + 'url' => $url, + ]); - return new RedirectResponse($redirect_url); - } - } + return new RedirectResponse($redirect_url); + } + } - /** - * A form to compose a message from a member. - * - * @param Request $request - * - * @return Response - */ - public function messagePage(Request $request): Response { - /** @var User $user */ - $user = $request->attributes->get('user'); + /** + * A form to compose a message from a member. + * + * @param Request $request + * + * @return Response + */ + public function messagePage(Request $request): Response + { + /** @var User $user */ + $user = $request->attributes->get('user'); - $referer = $request->headers->get('referer', ''); + $referer = $request->headers->get('referer', ''); - $body = $request->get('body', ''); - $subject = $request->get('subject', ''); - $to = $request->get('to', ''); - $url = $request->get('url', $referer); + $body = $request->get('body', ''); + $subject = $request->get('subject', ''); + $to = $request->get('to', ''); + $url = $request->get('url', $referer); - $to_user = User::findByUserName($to); + $to_user = User::findByUserName($to); - if ($to_user === null || $to_user->getPreference('contactmethod') === 'none') { - throw new AccessDeniedHttpException('Invalid contact user id'); - } + if ($to_user === null || $to_user->getPreference('contactmethod') === 'none') { + throw new AccessDeniedHttpException('Invalid contact user id'); + } - $title = I18N::translate('Send a message'); + $title = I18N::translate('Send a message'); - return $this->viewResponse('message-page', [ - 'body' => $body, - 'from' => $user, - 'subject' => $subject, - 'title' => $title, - 'to' => $to_user, - 'url' => $url, - ]); - } + return $this->viewResponse('message-page', [ + 'body' => $body, + 'from' => $user, + 'subject' => $subject, + 'title' => $title, + 'to' => $to_user, + 'url' => $url, + ]); + } - /** - * Send a message. - * - * @param Request $request - * - * @return RedirectResponse - */ - public function messageAction(Request $request): RedirectResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * Send a message. + * + * @param Request $request + * + * @return RedirectResponse + */ + public function messageAction(Request $request): RedirectResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - /** @var User $user */ - $user = $request->attributes->get('user'); + /** @var User $user */ + $user = $request->attributes->get('user'); - $body = $request->get('body', ''); - $subject = $request->get('subject', ''); - $to = $request->get('to', ''); - $url = $request->get('url', ''); + $body = $request->get('body', ''); + $subject = $request->get('subject', ''); + $to = $request->get('to', ''); + $url = $request->get('url', ''); - $to_user = User::findByUserName($to); - $ip = $request->getClientIp(); + $to_user = User::findByUserName($to); + $ip = $request->getClientIp(); - if ($to_user === null || $to_user->getPreference('contactmethod') === 'none') { - throw new AccessDeniedHttpException('Invalid contact user id'); - } + if ($to_user === null || $to_user->getPreference('contactmethod') === 'none') { + throw new AccessDeniedHttpException('Invalid contact user id'); + } - if ($body === '' || $subject === '') { - return new RedirectResponse(route('message', [ - 'body' => $body, - 'subject' => $subject, - 'to' => $to, - 'tree' => $tree, - 'url' => $url, - ])); - } + if ($body === '' || $subject === '') { + return new RedirectResponse(route('message', [ + 'body' => $body, + 'subject' => $subject, + 'to' => $to, + 'tree' => $tree, + 'url' => $url, + ])); + } - if ($this->deliverMessage($tree, $user->getEmail(), $user->getRealName(), $to_user, $subject, $body, $url, $ip)) { - FlashMessages::addMessage(I18N::translate('The message was successfully sent to %s.', e($to_user->getRealName())), 'success'); + if ($this->deliverMessage($tree, $user->getEmail(), $user->getRealName(), $to_user, $subject, $body, $url, $ip)) { + FlashMessages::addMessage(I18N::translate('The message was successfully sent to %s.', e($to_user->getRealName())), 'success'); - $url = $url ?: route('tree-page', ['ged' => $tree->getName()]); + $url = $url ?: route('tree-page', ['ged' => $tree->getName()]); - return new RedirectResponse($url); - } else { - FlashMessages::addMessage(I18N::translate('The message was not sent.'), 'danger'); + return new RedirectResponse($url); + } else { + FlashMessages::addMessage(I18N::translate('The message was not sent.'), 'danger'); - $redirect_url = route('contact', [ - 'body' => $body, - 'subject' => $subject, - 'to' => $to, - 'url' => $url, - ]); + $redirect_url = route('contact', [ + 'body' => $body, + 'subject' => $subject, + 'to' => $to, + 'url' => $url, + ]); - return new RedirectResponse($redirect_url); - } - } + return new RedirectResponse($redirect_url); + } + } - /** - * Contact messages can only be sent to the designated contacts - * - * @param Tree $tree - * - * @return User[] - */ - private function validContacts(Tree $tree) { - $contacts = [ - User::find((int) $tree->getPreference('CONTACT_USER_ID')), - User::find((int) $tree->getPreference('WEBMASTER_USER_ID')), - ]; + /** + * Contact messages can only be sent to the designated contacts + * + * @param Tree $tree + * + * @return User[] + */ + private function validContacts(Tree $tree) + { + $contacts = [ + User::find((int)$tree->getPreference('CONTACT_USER_ID')), + User::find((int)$tree->getPreference('WEBMASTER_USER_ID')), + ]; - return array_filter($contacts); - } + return array_filter($contacts); + } - /** - * Add a message to a user's inbox, send it to them via email, or both. - * - * @param Tree $tree - * @param string $sender_name - * @param string $sender_email - * @param User $recipient - * @param string $subject - * @param string $body - * @param string $url - * @param string $ip - * - * @return bool - */ - private function deliverMessage(Tree $tree, string $sender_email, string $sender_name, User $recipient, string $subject, string $body, string $url, string $ip): bool { - // Create a dummy user, so we can send messages from the tree. - $from = new User( - (object) [ - 'user_id' => null, - 'user_name' => '', - 'real_name' => $tree->getTitle(), - 'email' => $tree->getPreference('WEBTREES_EMAIL'), - ] - ); + /** + * Add a message to a user's inbox, send it to them via email, or both. + * + * @param Tree $tree + * @param string $sender_name + * @param string $sender_email + * @param User $recipient + * @param string $subject + * @param string $body + * @param string $url + * @param string $ip + * + * @return bool + */ + private function deliverMessage(Tree $tree, string $sender_email, string $sender_name, User $recipient, string $subject, string $body, string $url, string $ip): bool + { + // Create a dummy user, so we can send messages from the tree. + $from = new User( + (object)[ + 'user_id' => null, + 'user_name' => '', + 'real_name' => $tree->getTitle(), + 'email' => $tree->getPreference('WEBTREES_EMAIL'), + ] + ); - // Create a dummy user, so we can reply to visitors. - $sender = new User( - (object) [ - 'user_id' => null, - 'user_name' => '', - 'real_name' => $sender_name, - 'email' => $sender_email, - ] - ); + // Create a dummy user, so we can reply to visitors. + $sender = new User( + (object)[ + 'user_id' => null, + 'user_name' => '', + 'real_name' => $sender_name, + 'email' => $sender_email, + ] + ); - $success = true; + $success = true; - // Temporarily switch to the recipient's language - I18N::init($recipient->getPreference('language')); + // Temporarily switch to the recipient's language + I18N::init($recipient->getPreference('language')); - // Send via the internal messaging system. - if ($this->sendInternalMessage($recipient)) { - Database::prepare("INSERT INTO `##message` (sender, ip_address, user_id, subject, body) VALUES (? ,? ,? ,? ,?)") - ->execute([ - Auth::check() ? Auth::user()->getEmail() : $sender_email, - $ip, - $recipient->getUserId(), - $subject, - view('emails/message-user-text', ['sender' => $sender, 'recipient' => $recipient, 'message' => $body, 'url' => $url]), - ]); - } + // Send via the internal messaging system. + if ($this->sendInternalMessage($recipient)) { + Database::prepare("INSERT INTO `##message` (sender, ip_address, user_id, subject, body) VALUES (? ,? ,? ,? ,?)") + ->execute([ + Auth::check() ? Auth::user()->getEmail() : $sender_email, + $ip, + $recipient->getUserId(), + $subject, + view('emails/message-user-text', [ + 'sender' => $sender, + 'recipient' => $recipient, + 'message' => $body, + 'url' => $url, + ]), + ]); + } - // Send via email - if ($this->sendEmail($recipient)) { - $success = $success && Mail::send( - $from, - $recipient, - $sender, - I18N::translate('webtrees message') . ' - ' . $subject, - view('emails/message-user-text', ['sender' => $sender, 'recipient' => $recipient, 'message' => $body, 'url' => $url]), - view('emails/message-user-html', ['sender' => $sender, 'recipient' => $recipient, 'message' => $body, 'url' => $url]) - ); - } + // Send via email + if ($this->sendEmail($recipient)) { + $success = $success && Mail::send( + $from, + $recipient, + $sender, + I18N::translate('webtrees message') . ' - ' . $subject, + view('emails/message-user-text', [ + 'sender' => $sender, + 'recipient' => $recipient, + 'message' => $body, + 'url' => $url, + ]), + view('emails/message-user-html', [ + 'sender' => $sender, + 'recipient' => $recipient, + 'message' => $body, + 'url' => $url, + ]) + ); + } - I18N::init(WT_LOCALE); + I18N::init(WT_LOCALE); - return $success; - } + return $success; + } - /** - * Should we send messages to this user via internal messaging? - * - * @param User $user - * - * @return bool - */ - private function sendInternalMessage(User $user): bool { - return in_array($user->getPreference('contactmethod'), ['messaging', 'messaging2', 'mailto', 'none']); - } + /** + * Should we send messages to this user via internal messaging? + * + * @param User $user + * + * @return bool + */ + private function sendInternalMessage(User $user): bool + { + return in_array($user->getPreference('contactmethod'), [ + 'messaging', + 'messaging2', + 'mailto', + 'none', + ]); + } - /** - * Should we send messages to this user via email? - * - * @param User $user - * - * @return bool - */ - private function sendEmail(User $user): bool { - return in_array($user->getPreference('contactmethod'), ['messaging2', 'messaging3', 'mailto', 'none']); - } + /** + * Should we send messages to this user via email? + * + * @param User $user + * + * @return bool + */ + private function sendEmail(User $user): bool + { + return in_array($user->getPreference('contactmethod'), [ + 'messaging2', + 'messaging3', + 'mailto', + 'none', + ]); + } - /** - * Convert a username (or mailing list name) into an array of recipients. - * - * @param $to - * - * @return User[] - */ - private function recipientUsers(string $to): array { - switch ($to) { - default: - case 'all': - return User::all(); - case 'never_logged': - return array_filter(User::all(), function (User $user) { - return $user->getPreference('verified_by_admin') && $user->getPreference('reg_timestamp') > $user->getPreference('sessiontime'); - }); - case 'last_6mo': - return array_filter(User::all(), function (User $user) { - return $user->getPreference('sessiontime') > 0 && WT_TIMESTAMP - $user->getPreference('sessiontime') > 60 * 60 * 24 * 30 * 6; - }); - } - } + /** + * Convert a username (or mailing list name) into an array of recipients. + * + * @param $to + * + * @return User[] + */ + private function recipientUsers(string $to): array + { + switch ($to) { + default: + case 'all': + return User::all(); + case 'never_logged': + return array_filter(User::all(), function (User $user) { + return $user->getPreference('verified_by_admin') && $user->getPreference('reg_timestamp') > $user->getPreference('sessiontime'); + }); + case 'last_6mo': + return array_filter(User::all(), function (User $user) { + return $user->getPreference('sessiontime') > 0 && WT_TIMESTAMP - $user->getPreference('sessiontime') > 60 * 60 * 24 * 30 * 6; + }); + } + } - /** - * @param string $to - * - * @return string - */ - private function recipientDescription(string $to): string { - switch ($to) { - default: - case 'all': - return I18N::translate('Send a message to all users'); - case 'never_logged': - return I18N::translate('Send a message to users who have never signed in'); - case 'last_6mo': - return I18N::translate('Send a message to users who have not signed in for 6 months'); - } - } + /** + * @param string $to + * + * @return string + */ + private function recipientDescription(string $to): string + { + switch ($to) { + default: + case 'all': + return I18N::translate('Send a message to all users'); + case 'never_logged': + return I18N::translate('Send a message to users who have never signed in'); + case 'last_6mo': + return I18N::translate('Send a message to users who have not signed in for 6 months'); + } + } } |
