tao-test/app/ltiDeliveryProvider/model/delivery/DeliveryContainerService.php

130 lines
4.7 KiB
PHP

<?php
/**
* 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; under version 2
* of the License (non-upgradable).
*
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2018 (original work) Open Assessment Technologies SA;
*/
namespace oat\ltiDeliveryProvider\model\delivery;
use oat\oatbox\session\SessionService;
use oat\taoDeliveryRdf\model\DeliveryContainerService as DeliveryRdfContainerService;
use oat\taoLti\models\classes\LtiException;
use oat\taoLti\models\classes\LtiLaunchData;
use oat\taoLti\models\classes\LtiMessages\LtiErrorMessage;
use oat\taoLti\models\classes\LtiVariableMissingException;
use oat\taoLti\models\classes\TaoLtiSession;
/**
* Override the DeliveryContainerService in order to filter the plugin list based on the security flag.
*
* @author Aleh Hutnikau, <hutnikau@1pt.com>
*/
class DeliveryContainerService extends DeliveryRdfContainerService
{
const CUSTOM_LTI_SECURE = 'custom_secure';
const CUSTOM_LTI_TAO_FEATURES = 'custom_x_tao_features';
/**
* Validate and prepare launch variables
* @param LtiLaunchData $launchData
* @throws LtiException
* @throws \oat\taoLti\models\classes\LtiVariableMissingException
*/
protected function validateLtiParams(LtiLaunchData $launchData)
{
if ($launchData->hasVariable(self::CUSTOM_LTI_SECURE)) {
$val = mb_strtolower($launchData->getVariable(self::CUSTOM_LTI_SECURE));
if ($val !== 'true' && $val !== 'false') {
throw new LtiException(
__('Wrong value of "secure" variable.'),
LtiErrorMessage::ERROR_INVALID_PARAMETER
);
}
}
}
/**
* @inheritdoc
*/
protected function getActiveFeatures(\core_kernel_classes_Resource $delivery)
{
$result = parent::getActiveFeatures($delivery);
$currentSession = $this->getServiceLocator()->get(SessionService::SERVICE_ID)->getCurrentSession();
if ($currentSession instanceof TaoLtiSession) {
$launchData = $currentSession->getLaunchData();
$allFeatures = $this->getAllAvailableFeatures();
$ltiFeatures = $this->getLtiFeaturesList($launchData);
$enabledLtiFeatures = [];
$disabledLtiFeatures = [];
foreach ($ltiFeatures as $featureName => $featureStatus) {
if (empty($allFeatures[$featureName])) {
continue;
}
if (filter_var($featureStatus, FILTER_VALIDATE_BOOLEAN)) {
$enabledLtiFeatures[] = $featureName;
} else {
$disabledLtiFeatures[] = $featureName;
}
}
// TODO: Deprecated method, to be removed in version 11.0.0
$this->validateLtiParams($launchData);
if (!isset($ltiFeatures['security']) && $launchData->hasVariable(self::CUSTOM_LTI_SECURE)) {
if ($launchData->getVariable(self::CUSTOM_LTI_SECURE) === 'true') {
$enabledLtiFeatures[] = 'security';
} else {
$disabledLtiFeatures[] = 'security';
}
}
$result = array_merge($result, $enabledLtiFeatures);
$result = array_diff($result, $disabledLtiFeatures);
}
return array_unique($result);
}
/**
* @param LtiLaunchData $launchData
* @return array
*/
private function getLtiFeaturesList(LtiLaunchData $launchData) {
$ltiFeatures = [];
try {
if (!$launchData->hasVariable(self::CUSTOM_LTI_TAO_FEATURES)) {
return $ltiFeatures;
}
$toolsLtiVariable = $launchData->getVariable(self::CUSTOM_LTI_TAO_FEATURES);
$features = json_decode($toolsLtiVariable, true);
if (is_array($features)) {
$ltiFeatures = $features;
}
} catch (LtiVariableMissingException $e) {
$this->logWarning('Cannot get LTI parameter: ' . self::CUSTOM_LTI_TAO_FEATURES, [
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
]);
}
return $ltiFeatures;
}
}