| Current Path : /var/www/consult-e-syn/public_html/plugins/system/admintools/feature/ |
| Current File : /var/www/consult-e-syn/public_html/plugins/system/admintools/feature/emailfailedadminlong.php |
<?php
/**
* @package admintools
* @copyright Copyright (c)2010-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
use Joomla\CMS\Authentication\AuthenticationResponse;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
defined('_JEXEC') || die;
class AtsystemFeatureEmailfailedadminlong extends AtsystemFeatureAbstract
{
protected $loadOrder = 420;
/**
* Is this feature enabled?
*
* @return bool
*/
public function isEnabled()
{
if ($this->cparams->getValue('trackfailedlogins', 0) == 1)
{
// When track failed logins is enabled we don't send emails through this feature
return false;
}
if (!$this->container->platform->isBackend())
{
return false;
}
$emailonfailedadmin = $this->cparams->getValue('emailonfailedadminlogin', '');
if (empty($emailonfailedadmin))
{
return false;
}
return true;
}
/**
* Sends an email upon a failed administrator login
*
* @param AuthenticationResponse $response
*
* @return void
*/
public function onUserLoginFailure($response)
{
// Do not email about failed logins as a result of an empty username
if (!isset($response['username']) || empty($response['username']))
{
return;
}
// Make sure we don't fire unless someone is still in the login page
$user = $this->container->platform->getUser();
if (!$user->guest)
{
return;
}
$option = $this->input->getCmd('option');
$task = $this->input->getCmd('task');
if (($option != 'com_login') && ($task != 'login'))
{
return;
}
// Exit if the IP is blacklisted; logins originating from blacklisted IPs will be blocked anyway
if ($this->parentPlugin->runBooleanFeature('isIPBlocked', false, []))
{
return;
}
// If we are STILL in the login task WITHOUT a valid user, we had a login failure.
// Load the component's administrator translation files
$jlang = Factory::getLanguage();
$jlang->load('com_admintools', JPATH_ADMINISTRATOR, 'en-GB', true);
$jlang->load('com_admintools', JPATH_ADMINISTRATOR, $jlang->getDefault(), true);
$jlang->load('com_admintools', JPATH_ADMINISTRATOR, null, true);
// Get the site name
$config = $this->container->platform->getConfig();
// Construct the replacement table
$substitutions = $this->exceptionsHandler->getEmailVariables(Text::_('COM_ADMINTOOLS_WAFEMAILTEMPLATE_REASON_ADMINLOGINFAIL'));
/**
* The code above primes the [USER] variable from the current Joomla user object. However, this user object is
* ALWAYS the Guest user since we're not logged in yet. We need to replace it with $response['username'] whcih
* is how Joomla communicates back to plugins the username that failed to log in.
*/
$substitutions['[USER]'] = $response['username'];
// Let's get the most suitable email template
$template = $this->exceptionsHandler->getEmailTemplate('adminloginfail', true);
// Got no template, the user didn't published any email template, or the template doesn't want us to
// send a notification email. Anyway, let's stop here.
if (!$template)
{
return;
}
$subject = $template[0];
$body = $template[1];
foreach ($substitutions as $k => $v)
{
$subject = str_replace($k, $v, $subject);
$body = str_replace($k, $v, $body);
}
// Send the email
try
{
$mailer = Factory::getMailer();
$mailfrom = $config->get('mailfrom');
$fromname = $config->get('fromname');
$recipients = explode(',', $this->cparams->getValue('emailonfailedadminlogin', ''));
$recipients = array_map('trim', $recipients);
foreach ($recipients as $recipient)
{
if (empty($recipient))
{
continue;
}
// This line is required because SpamAssassin is BROKEN
$mailer->Priority = 3;
$mailer->isHtml(true);
$mailer->setSender([$mailfrom, $fromname]);
// Resets the recipients, otherwise they will pile up
$mailer->clearAllRecipients();
if ($mailer->addRecipient($recipient) === false)
{
// Failed to add a recipient?
continue;
}
$mailer->setSubject($subject);
$mailer->setBody($body);
$mailer->Send();
}
}
catch (Exception $e)
{
// Joomla! 3.5 and later throw an exception when crap happens instead of suppressing it and returning false
}
}
}