[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: Platform.php
<?php /** * Akeeba Engine * * @package akeebaengine * @copyright Copyright (c)2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program. If not, see * <https://www.gnu.org/licenses/>. */ namespace Akeeba\Engine; defined('AKEEBAENGINE') || die(); use Akeeba\Engine\Platform\Base; use Akeeba\Engine\Platform\PlatformInterface; use DirectoryIterator; use Exception; /** * Platform abstraction. Manages the loading of platform connector objects and delegates calls to itself the them. * * @property string $tableNameProfiles The name of the table where backup profiles are stored * @property string $tableNameStats The name of the table where backup records are stored * * @since 3.4 */ class Platform { /** @var Base|null The currently loaded platform connector object instance */ protected static $platformConnectorInstance = null; /** @var array A list of additional directories where platform classes can be found */ protected static $knownPlatformsDirectories = []; /** @var Platform The currently loaded object instance of this class. WARNING: This is NOT the platform connector! */ protected static $instance = null; /** * Public class constructor * * @param string $platform Optional; platform name. Leave blank to auto-detect. * * @throws Exception When the platform cannot be loaded */ public function __construct($platform = null) { if (empty($platform) || is_null($platform)) { $platform = static::detectPlatform(); } if (empty($platform)) { throw new Exception('Can not find a suitable Akeeba Engine platform for your site'); } static::$platformConnectorInstance = static::loadPlatform($platform); if (!is_object(static::$platformConnectorInstance)) { throw new Exception("Can not load Akeeba Engine platform $platform"); } } /** * Implements the Singleton pattern for this class * * @staticvar Platform $instance The static object instance * * @param string $platform Optional; platform name. Autodetect if blank. * * @return PlatformInterface */ public static function &getInstance($platform = null) { if (!is_object(static::$instance)) { static::$instance = new Platform($platform); } return static::$instance; } /** * Get a list of all directories where platform classes can be found * * @return array */ public static function getPlatformDirectories() { $defaultPath = []; if (is_object(static::$platformConnectorInstance)) { $defaultPath[] = __DIR__ . '/Platform/' . static::$platformConnectorInstance->platformName; } return array_merge( static::$knownPlatformsDirectories, $defaultPath ); } /** * Lists available platforms * * @staticvar array $platforms Static cache of the available platforms * * @return array The list of available platforms */ static public function listPlatforms() { if (empty(static::$knownPlatformsDirectories)) { $di = new DirectoryIterator(__DIR__ . '/Platform'); /** @var DirectoryIterator $file */ foreach ($di as $file) { if (!$file->isDir()) { continue; } if ($file->isDot()) { continue; } if ($file->getExtension() !== 'php') { continue; } $shortName = $file->getFilename(); $bareName = basename($shortName, '.php'); /** * We never have dots in our filenames but some hosts will rename files similar to foo.1.php when their * broken security scanners detect a false positive. This is our defence against that. */ if (strpos($bareName, '.') !== false) { continue; } static::$knownPlatformsDirectories[$shortName] = $file->getRealPath(); } } return static::$knownPlatformsDirectories; } /** * Add a platform to the list of known platforms * * @param string $slug Short name of the platform * @param string $platformDirectory The path where you can find it * * @return void */ public static function addPlatform($slug, $platformDirectory) { if (empty(static::$knownPlatformsDirectories)) { static::listPlatforms(); static::$knownPlatformsDirectories[$slug] = $platformDirectory; } } /** * Auto-detect the suitable platform for this site * * @return string * * @throws Exception When no platform is detected */ protected static function detectPlatform() { $platforms = static::listPlatforms(); if (empty($platforms)) { throw new Exception('No Akeeba Engine platform class found'); } $bestPlatform = (object) [ 'name' => null, 'priority' => 0, ]; foreach ($platforms as $platform => $path) { $o = static::loadPlatform($platform, $path); if (is_null($o)) { continue; } if ($o->isThisPlatform()) { if ($o->priority > $bestPlatform->priority) { $bestPlatform->priority = $o->priority; $bestPlatform->name = $platform; } } } return $bestPlatform->name; } /** * Load a given platform and return the platform object * * @param string $platform Platform name * @param string $path The path to laod the platform from (optional) * * @return Base */ protected static function &loadPlatform($platform, $path = null) { if (empty($path)) { if (isset(static::$knownPlatformsDirectories[$platform])) { $path = static::$knownPlatformsDirectories[$platform]; } } if (empty($path)) { $path = dirname(__FILE__) . '/' . $platform; } $classFile = $path . '/Platform.php'; $className = '\\Akeeba\\Engine\\Platform\\' . ucfirst($platform); $null = null; if (!file_exists($classFile)) { return $null; } require_once($classFile); if (!class_exists($className, false)) { return $null; } $o = new $className; return $o; } /** * Magic method to proxy all calls to the loaded platform object * * @param string $name The name of the method to call * @param array $arguments The arguments to pass * * @return mixed The result of the method being called * * @throws Exception When the platform isn't loaded or an non-existent method is called */ public function __call($name, array $arguments) { if (is_null(static::$platformConnectorInstance)) { throw new Exception('Akeeba Engine platform is not loaded'); } if (method_exists(static::$platformConnectorInstance, $name)) { return static::$platformConnectorInstance->$name(...$arguments); } else { throw new Exception('Method ' . $name . ' not found in Akeeba Platform'); } } /** * Magic getter for the properties of the loaded platform * * @param string $name The name of the property to get * * @return mixed The value of the property */ public function __get($name) { if (!isset(static::$platformConnectorInstance->$name) || !property_exists(static::$platformConnectorInstance, $name)) { static::$platformConnectorInstance->$name = null; user_error(__CLASS__ . ' does not support property ' . $name, E_NOTICE); } return static::$platformConnectorInstance->$name; } /** * Magic setter for the properties of the loaded platform * * @param string $name The name of the property to set * @param mixed $value The value of the property to set */ public function __set($name, $value) { if (isset(static::$platformConnectorInstance->$name) || property_exists(static::$platformConnectorInstance, $name)) { static::$platformConnectorInstance->$name = $value; } else { static::$platformConnectorInstance->$name = null; user_error(__CLASS__ . ' does not support property ' . $name, E_NOTICE); } } }
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: webm021.cluster127.gra.hosting.ovh.net
Server IP: 10.127.20.21
PHP Version: 8.4.22
Server Software: Apache
System: Linux webm021.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64
HDD Total: 14.32 GB
HDD Free: 8.45 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
Exists
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes
gcc:
No
pkexec:
No
git:
Yes
User Info
Username: vcomplcotr
User ID (UID): 38697
Group ID (GID): 100
Script Owner UID: 38697
Current Dir Owner: 38697