|
|
|
|
@ -13,7 +13,6 @@ use Symfony\Component\Filesystem\Filesystem; |
|
|
|
|
*/ |
|
|
|
|
class LtiProviderPlugin extends Plugin |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
const TABLE_PLATFORM = 'plugin_lti_provider_platform'; |
|
|
|
|
|
|
|
|
|
public $isAdminPlugin = true; |
|
|
|
|
@ -50,7 +49,6 @@ class LtiProviderPlugin extends Plugin |
|
|
|
|
'enabled' => 'boolean', |
|
|
|
|
]; |
|
|
|
|
parent::__construct($version, $author, $settings); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -131,9 +129,76 @@ class LtiProviderPlugin extends Plugin |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Creates the plugin tables on database |
|
|
|
|
* Save configuration for plugin. |
|
|
|
|
* |
|
|
|
|
* Generate a new key pair for platform when enabling plugin. |
|
|
|
|
* |
|
|
|
|
* @return void |
|
|
|
|
* @throws OptimisticLockException |
|
|
|
|
* @throws \Doctrine\ORM\ORMException |
|
|
|
|
* |
|
|
|
|
* @return $this|Plugin |
|
|
|
|
*/ |
|
|
|
|
public function performActionsAfterConfigure() |
|
|
|
|
{ |
|
|
|
|
$em = Database::getManager(); |
|
|
|
|
|
|
|
|
|
/** @var PlatformKey $platformKey */ |
|
|
|
|
$platformKey = $em |
|
|
|
|
->getRepository('ChamiloPluginBundle:LtiProvider\PlatformKey') |
|
|
|
|
->findOneBy([]); |
|
|
|
|
|
|
|
|
|
if ($this->get('enabled') === 'true') { |
|
|
|
|
if (!$platformKey) { |
|
|
|
|
$platformKey = new PlatformKey(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$keyPair = self::generatePlatformKeys(); |
|
|
|
|
|
|
|
|
|
$platformKey->setKid($keyPair['kid']); |
|
|
|
|
$platformKey->publicKey = $keyPair['public']; |
|
|
|
|
$platformKey->setPrivateKey($keyPair['private']); |
|
|
|
|
|
|
|
|
|
$em->persist($platformKey); |
|
|
|
|
} else { |
|
|
|
|
if ($platformKey) { |
|
|
|
|
$em->remove($platformKey); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$em->flush(); |
|
|
|
|
|
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Unistall plugin. Clear the database. |
|
|
|
|
*/ |
|
|
|
|
public function uninstall() |
|
|
|
|
{ |
|
|
|
|
$pluginEntityPath = $this->getEntityPath(); |
|
|
|
|
$fs = new Filesystem(); |
|
|
|
|
|
|
|
|
|
if ($fs->exists($pluginEntityPath)) { |
|
|
|
|
$fs->remove($pluginEntityPath); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
$this->dropPluginTables(); |
|
|
|
|
} catch (DBALException $e) { |
|
|
|
|
error_log('Error while uninstalling IMS/LTI plugin: '.$e->getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function trimParams(array &$params) |
|
|
|
|
{ |
|
|
|
|
foreach ($params as $key => $value) { |
|
|
|
|
$newValue = preg_replace('/\s+/', ' ', $value); |
|
|
|
|
$params[$key] = trim($newValue); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Creates the plugin tables on database. |
|
|
|
|
*/ |
|
|
|
|
private function createPluginTables(): void |
|
|
|
|
{ |
|
|
|
|
@ -165,7 +230,6 @@ class LtiProviderPlugin extends Plugin |
|
|
|
|
foreach ($queries as $query) { |
|
|
|
|
Database::query($query); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private function areTablesCreated(): bool |
|
|
|
|
@ -176,54 +240,10 @@ class LtiProviderPlugin extends Plugin |
|
|
|
|
return $connection->getSchemaManager()->tablesExist(self::TABLE_PLATFORM); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Save configuration for plugin. |
|
|
|
|
* |
|
|
|
|
* Generate a new key pair for platform when enabling plugin. |
|
|
|
|
* |
|
|
|
|
* @throws OptimisticLockException |
|
|
|
|
* @throws \Doctrine\ORM\ORMException |
|
|
|
|
* |
|
|
|
|
* @return $this|Plugin |
|
|
|
|
*/ |
|
|
|
|
public function performActionsAfterConfigure() |
|
|
|
|
{ |
|
|
|
|
$em = Database::getManager(); |
|
|
|
|
|
|
|
|
|
/** @var PlatformKey $platformKey */ |
|
|
|
|
$platformKey = $em |
|
|
|
|
->getRepository('ChamiloPluginBundle:LtiProvider\PlatformKey') |
|
|
|
|
->findOneBy([]); |
|
|
|
|
|
|
|
|
|
if ($this->get('enabled') === 'true') { |
|
|
|
|
if (!$platformKey) { |
|
|
|
|
$platformKey = new PlatformKey(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$keyPair = self::generatePlatformKeys(); |
|
|
|
|
|
|
|
|
|
$platformKey->setKid($keyPair['kid']); |
|
|
|
|
$platformKey->publicKey = $keyPair['public']; |
|
|
|
|
$platformKey->setPrivateKey($keyPair['private']); |
|
|
|
|
|
|
|
|
|
$em->persist($platformKey); |
|
|
|
|
} else { |
|
|
|
|
if ($platformKey) { |
|
|
|
|
$em->remove($platformKey); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$em->flush(); |
|
|
|
|
|
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Generate a key pair and key id for the platform. |
|
|
|
|
* |
|
|
|
|
* Return a associative array like ['kid' => '...', 'private' => '...', 'public' => '...']. |
|
|
|
|
* |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
private static function generatePlatformKeys(): array |
|
|
|
|
{ |
|
|
|
|
@ -251,28 +271,7 @@ class LtiProviderPlugin extends Plugin |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Unistall plugin. Clear the database |
|
|
|
|
*/ |
|
|
|
|
public function uninstall() |
|
|
|
|
{ |
|
|
|
|
$pluginEntityPath = $this->getEntityPath(); |
|
|
|
|
$fs = new Filesystem(); |
|
|
|
|
|
|
|
|
|
if ($fs->exists($pluginEntityPath)) { |
|
|
|
|
$fs->remove($pluginEntityPath); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
$this->dropPluginTables(); |
|
|
|
|
} catch (DBALException $e) { |
|
|
|
|
error_log('Error while uninstalling IMS/LTI plugin: '.$e->getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Drops the plugin tables on database |
|
|
|
|
* |
|
|
|
|
* @return boolean |
|
|
|
|
* Drops the plugin tables on database. |
|
|
|
|
*/ |
|
|
|
|
private function dropPluginTables(): bool |
|
|
|
|
{ |
|
|
|
|
@ -282,19 +281,9 @@ class LtiProviderPlugin extends Plugin |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param array $params |
|
|
|
|
*/ |
|
|
|
|
public function trimParams(array &$params) |
|
|
|
|
{ |
|
|
|
|
foreach ($params as $key => $value) { |
|
|
|
|
$newValue = preg_replace('/\s+/', ' ', $value); |
|
|
|
|
$params[$key] = trim($newValue); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Get a SimpleXMLElement object with the request received on php://input. |
|
|
|
|
* |
|
|
|
|
* @throws Exception |
|
|
|
|
*/ |
|
|
|
|
private function getRequestXmlElement(): ?SimpleXMLElement |
|
|
|
|
@ -307,5 +296,4 @@ class LtiProviderPlugin extends Plugin |
|
|
|
|
|
|
|
|
|
return new SimpleXMLElement($request); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|