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