166 lines
5.9 KiB
PHP
166 lines
5.9 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) 2016 (original work) Open Assessment Technologies SA;
|
|
*
|
|
*/
|
|
namespace oat\taoProctoring\model\authorization;
|
|
|
|
use common_Exception;
|
|
use oat\oatbox\service\ConfigurableService;
|
|
use oat\taoDeliveryRdf\model\DeliveryContainerService;
|
|
use oat\taoDelivery\model\execution\DeliveryExecution;
|
|
use oat\taoDelivery\model\execution\DeliveryExecutionInterface;
|
|
use oat\taoProctoring\model\DelegatedServiceHandler;
|
|
use oat\taoProctoring\model\delivery\DeliverySyncService;
|
|
use oat\taoProctoring\model\execution\DeliveryExecution as ProctoredDeliveryExecution;
|
|
use oat\taoDelivery\model\authorization\UnAuthorizedException;
|
|
use oat\oatbox\user\User;
|
|
use oat\taoProctoring\model\ProctorService;
|
|
use oat\generis\model\OntologyAwareTrait;
|
|
use oat\taoTests\models\runner\plugins\TestPlugin;
|
|
|
|
/**
|
|
* Manage the Delivery authorization.
|
|
*
|
|
* @author Bertrand Chevrier <bertrand@taotesting.com>
|
|
*/
|
|
class TestTakerAuthorizationService extends ConfigurableService implements TestTakerAuthorizationInterface, DelegatedServiceHandler
|
|
{
|
|
use OntologyAwareTrait;
|
|
|
|
/**
|
|
* @deprecated moved to \oat\taoProctoring\model\delivery\DeliverySyncService::PROCTORED_BY_DEFAULT
|
|
*/
|
|
const PROCTORED_BY_DEFAULT = 'proctored_by_default';
|
|
|
|
/**
|
|
* (non-PHPdoc)
|
|
* @see \oat\taoDelivery\model\authorization\AuthorizationProvider::verifyStartAuthorization()
|
|
* @param $deliveryId
|
|
* @param User $user
|
|
*/
|
|
public function verifyStartAuthorization($deliveryId, User $user)
|
|
{
|
|
// always allow start
|
|
}
|
|
|
|
/**
|
|
* (non-PHPdoc)
|
|
* @see \oat\taoDelivery\model\authorization\AuthorizationProvider::verifyResumeAuthorization()
|
|
* @param DeliveryExecutionInterface $deliveryExecution
|
|
* @param User $user
|
|
* @throws UnAuthorizedException
|
|
*/
|
|
public function verifyResumeAuthorization(DeliveryExecutionInterface $deliveryExecution, User $user)
|
|
{
|
|
$state = $deliveryExecution->getState()->getUri();
|
|
|
|
if (in_array($state, [
|
|
ProctoredDeliveryExecution::STATE_FINISHED,
|
|
ProctoredDeliveryExecution::STATE_CANCELED,
|
|
ProctoredDeliveryExecution::STATE_TERMINATED])
|
|
) {
|
|
throw new UnAuthorizedException(
|
|
_url('index', 'DeliveryServer', 'taoProctoring'),
|
|
'Terminated/Finished delivery execution "'.$deliveryExecution->getIdentifier().'" cannot be resumed'
|
|
);
|
|
}
|
|
$deliveryUri = $deliveryExecution->getDelivery()->getUri();
|
|
|
|
if (
|
|
$this->isProctored($deliveryUri, $user)
|
|
&& $state !== ProctoredDeliveryExecution::STATE_AUTHORIZED
|
|
&& !$this->isActiveUnSecureDelivery($deliveryExecution, $state)
|
|
) {
|
|
$this->throwUnAuthorizedException($deliveryExecution);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if delivery id proctored
|
|
*
|
|
* @param string $deliveryId
|
|
* @param User $user
|
|
* @return bool
|
|
* @internal param core_kernel_classes_Resource $delivery
|
|
* @throws \core_kernel_persistence_Exception
|
|
*/
|
|
public function isProctored($deliveryId, User $user)
|
|
{
|
|
$delivery = $this->getResource($deliveryId);
|
|
$proctored = $delivery->getOnePropertyValue($this->getProperty(ProctorService::ACCESSIBLE_PROCTOR));
|
|
|
|
if ($proctored instanceof \core_kernel_classes_Resource) {
|
|
$isProctored = $proctored->getUri() == ProctorService::ACCESSIBLE_PROCTOR_ENABLED;
|
|
} else {
|
|
$deliverySyncService = $this->getServiceLocator()->get(DeliverySyncService::SERVICE_ID);
|
|
$isProctored = $deliverySyncService->isProctoredByDefault();
|
|
}
|
|
|
|
return $isProctored;
|
|
}
|
|
|
|
/**
|
|
* @param DeliveryExecution $deliveryExecution
|
|
* @param string $state
|
|
* @return bool
|
|
* @throws common_Exception
|
|
*/
|
|
public function isActiveUnSecureDelivery(DeliveryExecution $deliveryExecution, $state)
|
|
{
|
|
return $state === DeliveryExecutionInterface::STATE_ACTIVE && !$this->isSecure($deliveryExecution);
|
|
}
|
|
|
|
/**
|
|
* @param DeliveryExecution $deliveryExecution
|
|
* @return bool
|
|
* @throws common_Exception
|
|
*/
|
|
public function isSecure(DeliveryExecution $deliveryExecution)
|
|
{
|
|
$deliveryContainerService = $this->getServiceLocator()->get(DeliveryContainerService::SERVICE_ID);
|
|
$enabledPlugins = $deliveryContainerService->getPlugins($deliveryExecution);
|
|
|
|
$secure = false;
|
|
foreach ($enabledPlugins as $plugin) {
|
|
if ($plugin instanceof TestPlugin && $plugin->getId() === 'blurPause') {
|
|
$secure = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $secure;
|
|
}
|
|
|
|
/**
|
|
* Throw the appropriate Exception
|
|
*
|
|
* @param DeliveryExecution $deliveryExecution
|
|
* @throws UnAuthorizedException
|
|
*/
|
|
protected function throwUnAuthorizedException(DeliveryExecution $deliveryExecution)
|
|
{
|
|
$errorPage = _url('awaitingAuthorization', 'DeliveryServer', 'taoProctoring', array('deliveryExecution' => $deliveryExecution->getIdentifier()));
|
|
throw new UnAuthorizedException($errorPage, 'Proctor authorization missing');
|
|
}
|
|
|
|
public function isSuitable(User $user, $deliveryId = null)
|
|
{
|
|
return true;
|
|
}
|
|
}
|