1<?php 2/** 3 * @package Joomla.Administrator 4 * @subpackage com_actionlogs 5 * 6 * @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved. 7 * @license GNU General Public License version 2 or later; see LICENSE.txt 8 */ 9 10defined('_JEXEC') or die; 11 12use Joomla\CMS\Component\ComponentHelper; 13use Joomla\CMS\Factory; 14use Joomla\CMS\Language\Text; 15use Joomla\CMS\Layout\FileLayout; 16use Joomla\Utilities\IpHelper; 17 18JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php'); 19 20/** 21 * Methods supporting a list of Actionlog records. 22 * 23 * @since 3.9.0 24 */ 25class ActionlogsModelActionlog extends JModelLegacy 26{ 27 /** 28 * Function to add logs to the database 29 * This method adds a record to #__action_logs contains (message_language_key, message, date, context, user) 30 * 31 * @param array $messages The contents of the messages to be logged 32 * @param string $messageLanguageKey The language key of the message 33 * @param string $context The context of the content passed to the plugin 34 * @param integer $userId ID of user perform the action, usually ID of current logged in user 35 * 36 * @return void 37 * 38 * @since 3.9.0 39 */ 40 public function addLog($messages, $messageLanguageKey, $context, $userId = null) 41 { 42 $user = Factory::getUser($userId); 43 $db = $this->getDbo(); 44 $date = Factory::getDate(); 45 $params = ComponentHelper::getComponent('com_actionlogs')->getParams(); 46 47 if ($params->get('ip_logging', 0)) 48 { 49 $ip = IpHelper::getIp(); 50 51 if (!filter_var($ip, FILTER_VALIDATE_IP)) 52 { 53 $ip = 'COM_ACTIONLOGS_IP_INVALID'; 54 } 55 } 56 else 57 { 58 $ip = 'COM_ACTIONLOGS_DISABLED'; 59 } 60 61 $loggedMessages = array(); 62 63 foreach ($messages as $message) 64 { 65 $logMessage = new stdClass; 66 $logMessage->message_language_key = $messageLanguageKey; 67 $logMessage->message = json_encode($message); 68 $logMessage->log_date = (string) $date; 69 $logMessage->extension = $context; 70 $logMessage->user_id = $user->id; 71 $logMessage->ip_address = $ip; 72 $logMessage->item_id = isset($message['id']) ? (int) $message['id'] : 0; 73 74 try 75 { 76 $db->insertObject('#__action_logs', $logMessage); 77 $loggedMessages[] = $logMessage; 78 } 79 catch (RuntimeException $e) 80 { 81 // Ignore it 82 } 83 } 84 85 // Send notification email to users who choose to be notified about the action logs 86 $this->sendNotificationEmails($loggedMessages, $user->name, $context); 87 } 88 89 /** 90 * Send notification emails about the action log 91 * 92 * @param array $messages The logged messages 93 * @param string $username The username 94 * @param string $context The Context 95 * 96 * @return void 97 * 98 * @since 3.9.0 99 */ 100 protected function sendNotificationEmails($messages, $username, $context) 101 { 102 $db = $this->getDbo(); 103 $query = $db->getQuery(true); 104 $params = ComponentHelper::getParams('com_actionlogs'); 105 $showIpColumn = (bool) $params->get('ip_logging', 0); 106 107 $query 108 ->select($db->quoteName(array('u.email', 'l.extensions'))) 109 ->from($db->quoteName('#__users', 'u')) 110 ->join( 111 'INNER', 112 $db->quoteName('#__action_logs_users', 'l') . ' ON ( ' . $db->quoteName('l.notify') . ' = 1 AND ' 113 . $db->quoteName('l.user_id') . ' = ' . $db->quoteName('u.id') . ')' 114 ); 115 116 $db->setQuery($query); 117 118 try 119 { 120 $users = $db->loadObjectList(); 121 } 122 catch (RuntimeException $e) 123 { 124 JError::raiseWarning(500, $e->getMessage()); 125 126 return; 127 } 128 129 $recipients = array(); 130 131 foreach ($users as $user) 132 { 133 $extensions = json_decode($user->extensions, true); 134 135 if ($extensions && in_array(strtok($context, '.'), $extensions)) 136 { 137 $recipients[] = $user->email; 138 } 139 } 140 141 if (empty($recipients)) 142 { 143 return; 144 } 145 146 $layout = new FileLayout('components.com_actionlogs.layouts.logstable', JPATH_ADMINISTRATOR); 147 $extension = strtok($context, '.'); 148 ActionlogsHelper::loadTranslationFiles($extension); 149 150 foreach ($messages as $message) 151 { 152 $message->extension = Text::_($extension); 153 $message->message = ActionlogsHelper::getHumanReadableLogMessage($message); 154 } 155 156 $displayData = array( 157 'messages' => $messages, 158 'username' => $username, 159 'showIpColumn' => $showIpColumn, 160 ); 161 162 $body = $layout->render($displayData); 163 $mailer = Factory::getMailer(); 164 $mailer->addRecipient($recipients); 165 $mailer->setSubject(Text::_('COM_ACTIONLOGS_EMAIL_SUBJECT')); 166 $mailer->isHTML(true); 167 $mailer->Encoding = 'base64'; 168 $mailer->setBody($body); 169 170 if (!$mailer->Send()) 171 { 172 JError::raiseWarning(500, Text::_('JERROR_SENDING_EMAIL')); 173 } 174 } 175} 176