Proyectos de Subversion Moodle

Rev

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

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle.  If not, see <http://www.gnu.org/licenses/>.

declare(strict_types=1);

namespace mod_edusharing;

use dml_exception;
use DOMDocument;
use EduSharingApiClient\EduSharingHelper;
use Exception;
use SimpleXMLElement;

/**
 * Class MetadataLogic
 *
 * @author Marian Ziegler <ziegler@edu-sharing.net>
 * @package mod_edusharing
 */
class MetadataLogic {
    /**
     * @var bool
     */
    public bool $reloadform = false;
    /**
     * @var string|null
     */
    private ?string $hostaliases = null;
    /**
     * @var string|null
     */
    private ?string $wloguestuser = null;
    /**
     * @var string|null
     */
    private ?string $appid = null;
    /**
     * @var EduSharingService
     */
    private EduSharingService $service;
    /**
     * @var UtilityFunctions|null
     */
    private ?UtilityFunctions $utils;

    /**
     * MetadataLogic constructor
     *
     * @param EduSharingService $service
     * @param UtilityFunctions|null $utils
     */
    public function __construct(EduSharingService $service, ?UtilityFunctions $utils = null) {
        $this->service = $service;
        $this->utils   = $utils;
        global $CFG;
        require_once($CFG->dirroot . '/mod/edusharing/eduSharingAutoloader.php');
        $this->init();
    }

    /**
     * Function init
     *
     * @return void
     */
    private function init(): void {
        $this->utils === null && $this->utils = new UtilityFunctions();
    }

    /**
     * Function import_metadata
     *
     * @param string $metadataurl
     * @param string|null $host
     * @throws EduSharingUserException
     * @throws dml_exception
     */
    public function import_metadata(string $metadataurl, ?string $host = null): void {
        global $CFG;
        $xml = new DOMDocument();
        libxml_use_internal_errors(true);
        $result = $this->service->import_metadata($metadataurl);
        if ($result->error !== 0) {
            $message = $result->info['message'] ?? 'unknown';
            debugging('cURL Error: ' . $message);
            $this->reloadform = true;
            throw new EduSharingUserException($message, 0, null,
                '<p style="background: #FF8170">cURL Error: ' . $message . '<br></p>');
        }
        if (!$xml->loadXML($result->content)) {
            $this->reloadform = true;
            throw new EduSharingUserException('xml error', 0, null,
                '<p style="background: #FF8170">could not load ' . $metadataurl . ' please check url <br></p>');
        }
        $xml->preserveWhiteSpace = false;
        $xml->formatOutput       = true;
        $entries                 = $xml->getElementsByTagName('entry');
        if ($this->appid === null) {
            $this->appid = !empty($this->utils->get_config_entry('application_appid'))
                ? $this->utils->get_config_entry('application_appid') : uniqid('moodle_');
        }
        $repoid     = $this->utils->get_config_entry('repository_appid');
        $privatekey = $this->utils->get_config_entry('application_private_key');
        $publickey  = $this->utils->get_config_entry('application_public_key');
        foreach ($entries as $entry) {
            $this->utils->set_config_entry('repository_' . $entry->getAttribute('key'), $entry->nodeValue);
        }
        if (empty ($host)) {
            if (!empty($_SERVER['SERVER_ADDR'])) {
                $host = $_SERVER['SERVER_ADDR'];
            } else if (!empty($_SERVER['SERVER_NAME'])) {
                $host = gethostbyname($_SERVER['SERVER_NAME']);
            } else {
                throw new Exception('Host could not be discerned. Cancelling ES-registration process.');
            }
        }
        $clientprotocol = $this->utils->get_config_entry('repository_clientprotocol');
        $repodomain     = $this->utils->get_config_entry('repository_domain');
        $clientport     = $this->utils->get_config_entry('repository_clientport');
        $this->utils->set_config_entry('application_host', $host);
        $this->utils->set_config_entry('application_appid', $this->appid);
        $this->utils->set_config_entry('application_type', 'LMS');
        $this->utils->set_config_entry('application_homerepid', $repoid);
        $this->utils->set_config_entry(
            'application_cc_gui_url', $clientprotocol . '://' . $repodomain . ':' . $clientport . '/edu-sharing/'
        );
        if ($this->hostaliases !== null) {
            $this->utils->set_config_entry('application_host_aliases', $this->hostaliases);
        }
        if ($this->wloguestuser !== null) {
            $this->utils->set_config_entry('wlo_guest_option', '1');
            $this->utils->set_config_entry('edu_guest_guest_id', $this->wloguestuser);
        }
        if (empty($privatekey) || empty($publickey)) {
            $keypair = EduSharingHelper::generateKeyPair();
            $this->utils->set_config_entry('application_private_key', $keypair['privateKey']);
            $this->utils->set_config_entry('application_public_key', $keypair['publicKey']);
        }
        if (empty($this->utils->get_config_entry('application_private_key'))) {
            throw new EduSharingUserException('ssl keypair generation error', 0, null,
                '<h3 class="edu_error">Generating of SSL keys failed. Please check your configuration.</h3>');
        }
        $this->utils->set_config_entry('application_blowfishkey', 'thetestkey');
        $this->utils->set_config_entry('application_blowfishiv', 'initvect');
        $this->utils->set_config_entry('EDU_AUTH_KEY', 'username');
        $this->utils->set_config_entry('EDU_AUTH_PARAM_NAME_USERID', 'userid');
        $this->utils->set_config_entry('EDU_AUTH_PARAM_NAME_LASTNAME', 'lastname');
        $this->utils->set_config_entry('EDU_AUTH_PARAM_NAME_FIRSTNAME', 'firstname');
        $this->utils->set_config_entry('EDU_AUTH_PARAM_NAME_EMAIL', 'email');
        $this->utils->set_config_entry('EDU_AUTH_AFFILIATION', $CFG->siteidentifier);
        $this->utils->set_config_entry('EDU_AUTH_AFFILIATION_NAME', $CFG->siteidentifier);
    }

    /**
     * Function create_xml_metadata
     *
     * @return string
     */
    public function create_xml_metadata(): string {
        global $CFG;
        // phpcs:disable -- This is just a long string.
        $xml = new SimpleXMLElement(
            '<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties></properties>');
        // phpcs:enable
        try {
            $entry = $xml->addChild('entry', $this->utils->get_config_entry('application_appid'));
            $entry->addAttribute('key', 'appid');
            $entry = $xml->addChild('entry', $this->utils->get_config_entry('application_type'));
            $entry->addAttribute('key', 'type');
            $entry = $xml->addChild('entry', 'moodle');
            $entry->addAttribute('key', 'subtype');
            $entry = $xml->addChild('entry', parse_url($CFG->wwwroot, PHP_URL_HOST));
            $entry->addAttribute('key', 'domain');
            $entry = $xml->addChild('entry', $this->utils->get_config_entry('application_host'));
            $entry->addAttribute('key', 'host');
            $entry = $xml->addChild('entry', $this->utils->get_config_entry('application_host_aliases'));
            $entry->addAttribute('key', 'host_aliases');
            $entry = $xml->addChild('entry', 'true');
            $entry->addAttribute('key', 'trustedclient');
            $entry = $xml->addChild('entry', 'moodle:course/update');
            $entry->addAttribute('key', 'hasTeachingPermission');
            $entry = $xml->addChild('entry', $this->utils->get_config_entry('application_public_key'));
            $entry->addAttribute('key', 'public_key');
            $entry = $xml->addChild('entry', $this->utils->get_config_entry('EDU_AUTH_AFFILIATION_NAME'));
            $entry->addAttribute('key', 'appcaption');
            if ($this->utils->get_config_entry('wlo_guest_option')) {
                $entry = $xml->addChild('entry', $this->utils->get_config_entry('edu_guest_guest_id'));
                $entry->addAttribute('key', 'auth_by_app_user_whitelist');
            }
        } catch (dml_exception $exception) {
            unset($exception);

            return '';
        }

        return html_entity_decode($xml->asXML(), ENT_COMPAT);
    }

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

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


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