| Server IP : 167.99.224.18 / Your IP : 216.73.216.136 Web Server : Apache/2.4.41 (Ubuntu) System : Linux wordpress-ubuntu-s-1vcpu-1gb-nyc1-01 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 User : root ( 0) PHP Version : 8.0.25 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/wp-content/plugins-old/matomo/app/core/Plugin/ |
Upload File : |
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugin;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugins\Login\PasswordVerifier;
use Piwik\Log\LoggerInterface;
use Exception;
/**
* The base class of all API singletons.
*
* Plugins that want to expose functionality through the Reporting API should create a class
* that extends this one. Every public method in that class that is not annotated with **@ignore**
* will be callable through Matomo's Web API.
*
* _Note: If your plugin calculates and stores reports, they should be made available through the API._
*
* ### Examples
*
* **Defining an API for a plugin**
*
* class API extends \Piwik\Plugin\API
* {
* public function myMethod($idSite, $period, $date, $segment = false)
* {
* $dataTable = // ... get some data ...
* return $dataTable;
* }
* }
*
* **Linking to an API method**
*
* <a href="?module=API&method=MyPlugin.myMethod&idSite=1&period=day&date=2013-10-23">Link</a>
*
* @api
*/
abstract class API
{
private static $instances;
/** @var bool */
protected $autoSanitizeInputParams = \true;
/**
* Returns the singleton instance for the derived class. If the singleton instance
* has not been created, this method will create it.
*
* @return static
*/
public static function getInstance()
{
$class = get_called_class();
if (!isset(self::$instances[$class])) {
$container = StaticContainer::getContainer();
$refl = new \ReflectionClass($class);
if (!$refl->getConstructor() || $refl->getConstructor()->isPublic()) {
self::$instances[$class] = $container->get($class);
} else {
/** @var LoggerInterface $logger */
$logger = $container->get(LoggerInterface::class);
// BC with API defining a protected constructor
$logger->notice('The API class {class} defines a protected constructor which is deprecated, make the constructor public instead', ['class' => $class]);
self::$instances[$class] = new $class();
}
}
return self::$instances[$class];
}
/**
* Used in tests only
* @ignore
* @internal
*/
public static function unsetInstance()
{
$class = get_called_class();
unset(self::$instances[$class]);
}
/**
* Used in tests only
* @ignore
* @internal
*/
public static function unsetAllInstances()
{
self::$instances = [];
}
/**
* Sets the singleton instance. For testing purposes.
* @ignore
* @internal
*/
public static function setSingletonInstance($instance)
{
$class = get_called_class();
self::$instances[$class] = $instance;
}
/**
* Verifies if the given password matches the current users password
*
* @param $passwordConfirmation
* @throws Exception
*/
protected function confirmCurrentUserPassword(
#[\SensitiveParameter]
$passwordConfirmation)
{
$loginCurrentUser = Piwik::getCurrentUserLogin();
if (!Piwik::doesUserRequirePasswordConfirmation($loginCurrentUser)) {
return;
// password confirmation disabled for user
}
if (empty($passwordConfirmation)) {
throw new Exception(Piwik::translate('UsersManager_ConfirmWithReAuthentication'));
}
try {
if (!StaticContainer::get(PasswordVerifier::class)->isPasswordCorrect($loginCurrentUser, $passwordConfirmation)) {
throw new Exception(Piwik::translate('UsersManager_CurrentPasswordNotCorrect'));
}
} catch (Exception $e) {
// in case of any error (e.g. the provided password is too weak)
throw new Exception(Piwik::translate('UsersManager_CurrentPasswordNotCorrect'));
}
}
/**
* @return bool
* @internal
*/
public function usesAutoSanitizeInputParams()
{
return $this->autoSanitizeInputParams;
}
}