186 lines
6.5 KiB
PHP
186 lines
6.5 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) 2013 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
|
||
|
*/
|
||
|
|
||
|
namespace oat\taoLti\models\classes;
|
||
|
|
||
|
use common_Exception;
|
||
|
use common_exception_Error;
|
||
|
use common_http_Request;
|
||
|
use common_session_SessionManager;
|
||
|
use core_kernel_classes_Class;
|
||
|
use core_kernel_classes_Resource;
|
||
|
use OAT\Library\Lti1p3Core\Message\Payload\LtiMessagePayloadInterface;
|
||
|
use OAT\Library\Lti1p3Core\Message\Payload\MessagePayloadInterface;
|
||
|
use oat\oatbox\log\LoggerService;
|
||
|
use oat\oatbox\service\ConfigurableService;
|
||
|
use oat\oatbox\service\ServiceManager;
|
||
|
use oat\oatbox\session\SessionService;
|
||
|
use oat\tao\model\TaoOntology;
|
||
|
use oat\taoLti\models\classes\LtiMessages\LtiErrorMessage;
|
||
|
use oat\taoLti\models\classes\Platform\Repository\Lti1p3RegistrationRepository;
|
||
|
use oat\taoLti\models\classes\Platform\Repository\LtiPlatformRepositoryInterface;
|
||
|
use oat\taoLti\models\classes\user\Lti1p3User;
|
||
|
use Psr\Log\LogLevel;
|
||
|
|
||
|
class LtiService extends ConfigurableService
|
||
|
{
|
||
|
const LIS_CONTEXT_ROLE_NAMESPACE = 'urn:lti:role:ims/lis/';
|
||
|
|
||
|
const LTICONTEXT_SESSION_KEY = 'LTICONTEXT';
|
||
|
|
||
|
public function createLtiSession(common_http_Request $request)
|
||
|
{
|
||
|
try {
|
||
|
/** @var FactoryLtiAuthAdapterService $factoryAuth */
|
||
|
$factoryAuth = $this->getServiceLocator()->get(FactoryLtiAuthAdapterServiceInterface::SERVICE_ID);
|
||
|
$adapter = $factoryAuth->create($request);
|
||
|
$user = $adapter->authenticate();
|
||
|
$session = new TaoLtiSession($user);
|
||
|
|
||
|
$this->getServiceLocator()->propagate($session);
|
||
|
return $session;
|
||
|
} catch (LtiInvalidVariableException $e) {
|
||
|
$this->getServiceLocator()->get(LoggerService::SERVICE_ID)
|
||
|
->log(LogLevel::INFO, $e->getMessage());
|
||
|
throw new LtiException(
|
||
|
__('You are not authorized to use this system'),
|
||
|
LtiErrorMessage::ERROR_UNAUTHORIZED
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function createLti1p3Session(LtiMessagePayloadInterface $messagePayload)
|
||
|
{
|
||
|
try {
|
||
|
/** @var Lti1p3RegistrationRepository $repository */
|
||
|
$repository = $this->getServiceLocator()->get(Lti1p3RegistrationRepository::SERVICE_ID);
|
||
|
$registration = $repository->findByPlatformIssuer(
|
||
|
$messagePayload->getMandatoryClaim(MessagePayloadInterface::CLAIM_ISS),
|
||
|
$messagePayload->getMandatoryClaim(MessagePayloadInterface::CLAIM_AUD)[0]
|
||
|
);
|
||
|
|
||
|
/** @var LtiPlatformRepositoryInterface $platformRepository */
|
||
|
$platformRepository = $this->getServiceLocator()->get(LtiPlatformRepositoryInterface::SERVICE_ID);
|
||
|
$platform = $platformRepository->searchById($registration->getPlatform()->getIdentifier());
|
||
|
|
||
|
$session = TaoLtiSession::fromVersion1p3(
|
||
|
new Lti1p3User(LtiLaunchData::fromLti1p3MessagePayload($messagePayload, $platform))
|
||
|
);
|
||
|
|
||
|
$this->getServiceLocator()->propagate($session);
|
||
|
|
||
|
return $session;
|
||
|
} catch (LtiInvalidVariableException $e) {
|
||
|
$this->getServiceLocator()->get(LoggerService::SERVICE_ID)
|
||
|
->log(LogLevel::INFO, $e->getMessage());
|
||
|
|
||
|
throw new LtiException(
|
||
|
$e->getMessage(),
|
||
|
LtiErrorMessage::ERROR_UNAUTHORIZED
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* start a session from the provided OAuth Request
|
||
|
*
|
||
|
* @param common_http_Request $request
|
||
|
*
|
||
|
* @throws LtiException
|
||
|
* @throws common_Exception
|
||
|
* @throws \ResolverException
|
||
|
*/
|
||
|
public function startLtiSession(common_http_Request $request)
|
||
|
{
|
||
|
$this->getServiceLocator()->get(SessionService::SERVICE_ID)->setSession($this->createLtiSession($request));
|
||
|
}
|
||
|
|
||
|
public function startLti1p3Session(LtiMessagePayloadInterface $messagePayload)
|
||
|
{
|
||
|
$this->getServiceLocator()->get(SessionService::SERVICE_ID)->setSession(
|
||
|
$this->createLti1p3Session($messagePayload)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the current LTI session
|
||
|
*
|
||
|
* @return TaoLtiSession
|
||
|
* @throws LtiException
|
||
|
* @throws common_exception_Error
|
||
|
*/
|
||
|
public function getLtiSession()
|
||
|
{
|
||
|
$session = common_session_SessionManager::getSession();
|
||
|
if (!$session instanceof TaoLtiSession) {
|
||
|
throw new LtiException(__FUNCTION__.' called on a non LTI session', LtiErrorMessage::ERROR_SYSTEM_ERROR);
|
||
|
}
|
||
|
$this->getServiceLocator()->propagate($session);
|
||
|
|
||
|
return $session;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $key
|
||
|
* @return mixed
|
||
|
* @throws LtiException
|
||
|
*/
|
||
|
public function getCredential($key)
|
||
|
{
|
||
|
$class = new core_kernel_classes_Class(ConsumerService::CLASS_URI);
|
||
|
$instances = $class->searchInstances([TaoOntology::PROPERTY_OAUTH_KEY => $key], ['like' => false]);
|
||
|
if (count($instances) == 0) {
|
||
|
throw new LtiException('No Credentials for consumer key '.$key, LtiErrorMessage::ERROR_UNAUTHORIZED);
|
||
|
}
|
||
|
if (count($instances) > 1) {
|
||
|
throw new LtiException(
|
||
|
'Multiple Credentials for consumer key '.$key,
|
||
|
LtiErrorMessage::ERROR_INVALID_PARAMETER
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return current($instances);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the LTI Consumer resource associated to this lti session
|
||
|
*
|
||
|
* @access public
|
||
|
* @param LtiLaunchData $launchData
|
||
|
* @return core_kernel_classes_Resource resource of LtiConsumer
|
||
|
* @throws LtiVariableMissingException
|
||
|
* @author Joel Bout, <joel@taotesting.com>
|
||
|
* @deprecated use LtiLaunchData::getLtiConsumer instead
|
||
|
*/
|
||
|
public function getLtiConsumerResource($launchData)
|
||
|
{
|
||
|
return $launchData->getLtiConsumer();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return LtiService
|
||
|
* @deprecated
|
||
|
*/
|
||
|
public static function singleton()
|
||
|
{
|
||
|
return ServiceManager::getServiceManager()->get(static::class);
|
||
|
}
|
||
|
}
|