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/>.namespace core_files\redactor;/*** Fileredact manager.** Manages and executes redaction services.** @package core_files* @copyright Meirza <meirza.arson@moodle.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class manager {/** @var array Holds an array of error messages. */private array $errors = [];/*** Redacts the given file.** @param string $mimetype The mime-type of the file* @param string $filepath The path to the file to redact* @return string|null The path to the redacted file or null if no redaction services are available.*/public function redact_file(string $mimetype,string $filepath,): ?string {// Get the file redact services.$services = $this->get_service_classnames();$serviceinstances = array_filter(array_map(fn($serviceclass) => new $serviceclass(), $services),fn($service) => $service->is_enabled() && $service->is_mimetype_supported($mimetype));if (count($serviceinstances) === 0) {return null;}foreach ($serviceinstances as $servicename => $service) {try {return $service->redact_file_by_path($mimetype, $filepath);} catch (\Throwable $e) {$this->errors[] = $e;}}return null;}/*** Redacts the given file content.** @param string $mimetype The mime-type of the file* @param string $filecontent The file content to redact* @return string|null The content of the redacted file*/public function redact_file_content(string $mimetype,string $filecontent,): ?string {// Get the file redact services.$services = $this->get_file_services_for_mimetype($mimetype);foreach ($services as $servicename => $service) {try {return $service->redact_file_by_content($mimetype, $filecontent);} catch (\Throwable $e) {$this->errors[] = $e;}}return null;}/*** Returns a list of applicable redaction services.** @return string[] list of service classnames.*/public function get_service_classnames(): array {global $CFG;$servicesdir = "{$CFG->dirroot}/files/classes/redactor/services/";$servicefiles = glob("{$servicesdir}*_service.php");$services = [];foreach ($servicefiles as $servicefile) {$servicename = basename($servicefile, '_service.php');$serviceclass = services::class . "\\{$servicename}_service";if (!is_a($serviceclass, services\service::class, true)) {continue;}$services[$servicename] = $serviceclass;}return $services;}/*** Returns a list of file redaction services that support the given mime-type.** @param string $mimetype The mime-type to filter by* @return services\file_redactor_service_interface[] An array of file redaction services that support the given mime-type.*/protected function get_file_services_for_mimetype(string $mimetype): array {return array_filter(array_map(function(string $serviceclass) use ($mimetype): ?services\file_redactor_service_interface {if (!is_a($serviceclass, services\file_redactor_service_interface::class, true)) {return null;}$service = new $serviceclass();if ($service->is_mimetype_supported($mimetype)) {return $service;}return null;},$this->get_service_classnames(),), fn ($service) => $service !== null);}/*** Retrieves an array of error messages.** @return array An array of error messages.*/public function get_errors(): array {return $this->errors;}}