Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

<?php declare(strict_types=1);

namespace EduSharingApiClient;

use Exception;

/**
 * Class EduSharingHelperBase
 *
 * @author Torsten Simon  <simon@edu-sharing.net>
 */
class EduSharingHelperBase
{
    public string      $baseUrl;
    public string      $privateKey;
    public string      $appId;
    public string      $language = 'de';
    public CurlHandler $curlHandler;

    /**
     * @param string $baseUrl
     * The base url to your repository in the format "http://<host>/edu-sharing"
     * @param string $privateKey
     * Your app's private key. This must match the public key registered in the repo
     * @param string $appId
     * Your app id name (as registered in the edu-sharing repository)
     * @throws Exception
     */
    public function __construct(string $baseUrl, string $privateKey, string $appId) {
        if (!preg_match('/^([a-z]|[A-Z]|[0-9]|[-_]|[.])+$/', $appId)) {
            throw new InvalidAppIdException('The given app id contains invalid characters or symbols');
        }
        $baseUrl           = rtrim($baseUrl, '/');
        $this->baseUrl     = $baseUrl;
        $this->privateKey  = $privateKey;
        $this->appId       = $appId;
        $this->curlHandler = new DefaultCurlHandler();
    }

    /**
     * Function registerCurlHandler
     *
     * @param CurlHandler $handler
     * @return void
     */
    public function registerCurlHandler(CurlHandler $handler): void {
        $this->curlHandler = $handler;
    }

    /**
     * Function handleCurlRequest
     *
     * @param string $url
     * @param array $curlOptions
     * @return CurlResult
     */
    public function handleCurlRequest(string $url, array $curlOptions): CurlResult {
        return $this->curlHandler->handleCurlRequest($url, $curlOptions);
    }

    /**
     * Function setLanguage
     *
     * @param string $language
     * @return void
     */
    public function setLanguage(string $language): void {
        $this->language = $language;
    }

    /**
     * Function sign
     *
     * @param string $toSign
     * @return string
     * @throws Exception
     */
    public function sign(string $toSign): string {
        $privateKeyId = openssl_get_privatekey($this->privateKey);
        $success      = false;
        if ($privateKeyId !== false) {
            $success = openssl_sign($toSign, $signature, $privateKeyId);
        }
        if (!$success || !isset($signature)) {
            throw new Exception("Private key invalid or empty.");
        }
        return base64_encode($signature);
    }

    /**
     * will throw an exception if the given edu-sharing api is not compatible with this library version
     * i.e. you could call this in your configuration / setup
     *
     * @throws Exception
     */
    public function verifyCompatibility(): void {
        $minVersion = '8.0';
        $request    = $this->handleCurlRequest($this->baseUrl . '/rest/_about', [
            CURLOPT_HTTPHEADER     => [
                'Accept: application/json',
                'Content-Type: application/json',
            ],
            CURLOPT_FAILONERROR    => false,
            CURLOPT_RETURNTRANSFER => 1
        ]);
        if ((int)$request->info["http_code"] === 200) {
            $result = json_decode($request->content, true, 512, JSON_THROW_ON_ERROR);
            if (version_compare($result["version"]["repository"], $minVersion) < 0) {
                throw new Exception("The edu-sharing version of the target repository is too low. Minimum required is " . $minVersion . "\n" . print_r($result['version'] ?? $result, true));
            }
        } else {
            throw new Exception("The edu-sharing version could not be retrieved\n" . print_r($request->info, true));
        }
    }
}