File Manager

Current Directory: /home/astoriaah/www/administrator/components/com_akeeba/BackupEngine/Postproc/Connector
Viewing File: /home/astoriaah/www/administrator/components/com_akeeba/BackupEngine/Postproc/Connector/Ovh.php
<?php /** * Akeeba Engine * * @package akeebaengine * @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ namespace Akeeba\Engine\Postproc\Connector; defined('AKEEBAENGINE') || die(); use Akeeba\Engine\Postproc\Connector\Cloudfiles\Exception\Http; use Akeeba\Engine\Postproc\Connector\Cloudfiles\Exception\Missing\Apikey; use Akeeba\Engine\Postproc\Connector\Cloudfiles\Exception\Missing\Tenantid; use Akeeba\Engine\Postproc\Connector\Cloudfiles\Exception\Missing\Username; use Akeeba\Engine\Postproc\Connector\Cloudfiles\Request; use DateTime; class Ovh extends Swift { /** * Ovh constructor. * * @param string $tenantId The OpenStack tenant ID. * @param string $username The OpenStack username. * @param string $password The OpenStack password. * * @throws Apikey * @throws Tenantid * @throws Username * @since 6.1.0 * */ public function __construct($tenantId, $username, $password) { // OVH is now using Keystone v3 $authEndpoint = 'https://auth.cloud.ovh.net/v3'; // Data validation if (empty($tenantId)) { throw new TenantId('You have not specified your OVH OpenStack Project ID'); } if (empty($username)) { throw new Username('You have not specified your OVH OpenStack Username'); } if (empty($username)) { throw new Apikey('You have not specified your OVH OpenStack Password'); } parent::__construct($authEndpoint, $tenantId, $username, $password); } /** * Returns the authentication token. * * Note: OVH uses Keystone 3 which is MUCH different than OpenStack's Keystone v2 * * @see https://docs.ovh.com/gb/en/storage/pca/dev/#authentication * * @return string * @throws Http * * @since 7.0.0 */ protected function authenticate() { // Send the scoped token request to Keystone $message = [ 'auth' => [ 'identity' => [ 'methods' => [ 'password', ], 'password' => [ 'user' => [ 'name' => $this->username, 'domain' => [ 'name' => "Default", ], 'password' => $this->password, ], ], ], 'scope' => [ 'project' => [ 'id' => $this->tenantId, 'domain' => [ 'name' => 'Default', ], ], ], ], ]; $json = json_encode($message); $url = rtrim($this->authEndpoint, '/') . '/auth/tokens'; $request = new Request('POST', $url); $request->data = $json; $request->setHeader('Accept', 'application/json'); $request->setHeader('Content-Type', 'application/json'); $request->setHeader('Content-Length', strlen($request->data)); $response = $request->getResponse(); // Get the tenant (project) ID $this->tenantId = $response->body->token->project->id; // Get the token and its expiration $this->token = $response->headers['x-subject-token']; $date = new DateTime($response->body->token->expires_at); $this->tokenExpiration = $date->getTimestamp(); // Loop through the serviceCatalog and index the Swift endpoints if (isset($response->body->token->catalog)) { foreach ($response->body->token->catalog as $service) { if ($service->type != 'object-store') { continue; } if (!isset($service->endpoints)) { continue; } foreach ($service->endpoints as $endpoint) { $this->endPoints[$endpoint->region_id] = $endpoint->url; } } } // Callback if (is_callable($this->authenticationCallback)) { call_user_func_array($this->authenticationCallback, [&$this, $response]); } return $this->token; } }