ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilObjLTIConsumerGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
39 {
40  public const CFORM_CUSTOM_NEW = 99;
41  public const CFORM_DYNAMIC_REGISTRATION = 98; //
42 
43  public const TAB_ID_INFO = 'tab_info';
44  public const TAB_ID_CONTENT = 'tab_content';
45  public const TAB_ID_SETTINGS = 'tab_settings';
46  public const TAB_ID_STATEMENTS = 'tab_statements';
47  public const TAB_ID_SCORING = 'tab_scoring';
48  public const TAB_ID_GRADE_SYNCHRONIZATION = 'tab_grade_synchronization';
49  public const TAB_ID_METADATA = 'tab_metadata';
50  public const TAB_ID_LEARNING_PROGRESS = 'learning_progress';
51  public const TAB_ID_PERMISSIONS = 'perm_settings';
52 
53  public const DEFAULT_CMD = 'launch';
54 
55  public ?ilObject $object = null;
57 
58  public int $parent_node_id = 0; //check
59 
60  public function __construct(int $a_id = 0, int $a_id_type = self::REPOSITORY_NODE_ID, int $a_parent_node_id = 0)
61  {
62  global $DIC;
63  /* @var \ILIAS\DI\Container $DIC */
64 
65  parent::__construct($a_id, $a_id_type, $a_parent_node_id);
66  $this->parent_node_id = $a_parent_node_id;
67  if ($this->object instanceof ilObjLTIConsumer) {
68  $this->ltiAccess = new ilLTIConsumerAccess($this->object);
69  }
70 
71  $DIC->language()->loadLanguageModule("lti");
72  $DIC->language()->loadLanguageModule("rep");
73  }
74 
75  public function getType(): string
76  {
77  return 'lti';
78  }
79 
83  protected function initCreationForms(string $a_new_type): array
84  {
85  $forms = array(
86  self::CFORM_NEW => $this->initCreateForm($a_new_type)
87  );
88 
90  $forms[self::CFORM_DYNAMIC_REGISTRATION] = $this->initDynRegForm($a_new_type);
91  $forms[self::CFORM_CUSTOM_NEW] = $this->initCustomCreateForm($a_new_type);
92  }
93 
94  return $forms;
95  }
96 
97  protected function initCreateForm(string $a_new_type): \ilLTIConsumerProviderSelectionFormTableGUI
98  {
99  global $DIC;
100  /* @var \ILIAS\DI\Container $DIC */
101 
102  $form = $this->buildProviderSelectionForm($a_new_type);
103 
104  $globalProviderList = new ilLTIConsumeProviderList();
105  $globalProviderList->setAvailabilityFilter((string) ilLTIConsumeProvider::AVAILABILITY_CREATE);
106  $globalProviderList->setScopeFilter(ilLTIConsumeProviderList::SCOPE_GLOBAL);
107 
108  $userProviderList = new ilLTIConsumeProviderList();
109  $userProviderList->setAvailabilityFilter((string) ilLTIConsumeProvider::AVAILABILITY_CREATE);
110  $userProviderList->setScopeFilter(ilLTIConsumeProviderList::SCOPE_USER);
111  $userProviderList->setCreatorFilter($DIC->user()->getId());
112 
113  if ($form->getFilter('title')) {
114  $globalProviderList->setTitleFilter($form->getFilter('title'));
115  $userProviderList->setTitleFilter($form->getFilter('title'));
116  }
117 
118  if ($form->getFilter('category')) {
119  $globalProviderList->setCategoryFilter($form->getFilter('category'));
120  $userProviderList->setCategoryFilter($form->getFilter('category'));
121  }
122 
123  if ($form->getFilter('keyword')) {
124  $globalProviderList->setKeywordFilter($form->getFilter('keyword'));
125  $userProviderList->setKeywordFilter($form->getFilter('keyword'));
126  }
127 
128  if ($form->getFilter('outcome')) {
129  $globalProviderList->setHasOutcomeFilter(true);
130  $userProviderList->setHasOutcomeFilter(true);
131  }
132 
133  if ($form->getFilter('internal')) {
134  $globalProviderList->setIsExternalFilter(false);
135  $userProviderList->setIsExternalFilter(false);
136  }
137 
138  if ($form->getFilter('with_key')) {
139  $globalProviderList->setIsProviderKeyCustomizableFilter(false);
140  $userProviderList->setIsProviderKeyCustomizableFilter(false);
141  }
142 
143  $globalProviderList->load();
144  $userProviderList->load();
145 
146  $form->setData([...$globalProviderList->getTableData(), ...$userProviderList->getTableData()]);
147 
148  return $form;
149  }
150 
151  public function initDynRegForm(string $a_new_type): \ilLTIConsumeProviderFormGUI
152  {
153  global $DIC;
154  /* @var \ILIAS\DI\Container $DIC */
157  $form->initDynRegForm($this->ctrl->getFormAction($this, "cancelDynReg"));
158  $form->setTitle($DIC->language()->txt($a_new_type . '_dynamic_registration'));
159  return $form;
160  }
161 
162  public function initShowToolConfig(string $a_new_type, int $a_provider_id): \ilLTIConsumeProviderFormGUI
163  {
164  global $DIC;
165 
166  //ToDo: Error Handling
167  $provider = new ilLTIConsumeProvider($a_provider_id);
168 
170 
171  $form->initToolConfigForm($this->ctrl->getFormAction($this, "cancelDynReg"), '', '');
172 
173  $form->clearCommandButtons();
174  $form->addCommandButton("saveDynReg", $this->lng->txt('save'));
175  $form->addCommandButton("cancelDynReg", $this->lng->txt("cancel"));
176 
177  $form->setTitle($DIC->language()->txt($a_new_type . '_custom_new'));
178 
179  return $form;
180  }
181 
182  public function initCustomCreateForm(string $a_new_type): \ilLTIConsumeProviderFormGUI
183  {
184  global $DIC;
185  /* @var \ILIAS\DI\Container $DIC */
186 
188 
190 
191  $form->initForm($this->ctrl->getFormAction($this, "save"), '', '');
192 
193  $form->clearCommandButtons();
194  $form->addCommandButton("saveCustom", $this->lng->txt($a_new_type . "_add_own_provider"));
195  $form->addCommandButton("cancel", $this->lng->txt("cancel"));
196 
197  $form->setTitle($DIC->language()->txt($a_new_type . '_custom_new'));
198 
199  return $form;
200  }
201 
203  {
205  $a_new_type,
206  $this,
207  'create',
208  'applyProviderFilter',
209  'resetProviderFilter'
210  );
211  }
212 
213  protected function applyProviderFilter(): void
214  {
215  $form = $this->buildProviderSelectionForm('');
216  $form->applyFilter();
217  $this->createObject();
218  }
219 
220  protected function resetProviderFilter(): void
221  {
222  $form = $this->buildProviderSelectionForm('');
223  $form->resetFilter();
224  $this->createObject();
225  }
226 
227  protected function createNewObject(string $newType, string $title, string $description): ilObject
228  {
229  $classname = "ilObj" . $this->obj_definition->getClassName($newType);
230 
231  $newObj = new $classname();
232  $newObj->setType($newType);
233  $newObj->setTitle($title);
234  $newObj->setDescription($description);
235  $newObj->create();
236  $this->putObjectInTree($newObj);
237  return $newObj;
238  }
239 
240  public function saveCustom(): void
241  {
243  throw new ilLtiConsumerException('permission denied!');
244  }
245 
246  global $DIC;
247  /* @var \ILIAS\DI\Container $DIC */
248 
249  $new_type = $this->getRequestValue("new_type");
250 
251  $DIC->ctrl()->setParameter($this, "new_type", $new_type);
252 
253  $DIC->language()->loadLanguageModule($new_type);
254 
255  $form = $this->initCustomCreateForm($new_type);
256 
257  if ($form->checkInput()) {
258  $DIC->ctrl()->setParameter($this, "new_type", "");
259 
260  // create object
261  $newObj = $this->createNewObject(
262  $new_type,
263  $form->getInput('title'),
264  $form->getInput('desc')
265  );
266 
267  // apply didactic template?
268  $dtpl = $this->getDidacticTemplateVar("dtpl");
269  if ($dtpl) {
270  $newObj->applyDidacticTemplate($dtpl);
271  }
272 
273  $this->afterSave($newObj);
274 
275  return;
276  }
277 
278  $form->setValuesByPost();
279 
280  $DIC->ui()->mainTemplate()->setContent($form->getHtml());
281  }
282 
283  public function addDynReg(): void
284  {
285  global $DIC;
287  throw new ilLtiConsumerException('permission denied!');
288  }
289  $new_type = $this->getRequestValue("new_type");
290 
291  $DIC->ctrl()->setParameter($this, "new_type", $new_type);
292 
293  $DIC->language()->loadLanguageModule($new_type);
294  $form = $this->initDynRegForm($new_type);
295  $error = ($this->getRequestValue('error') != null) ? $this->getRequestValue('error') : "";
296  $form->setValuesByPost();
297  if (!empty($error)) {
298  $DIC->ctrl()->setParameter($this, "new_type", "");
299  $DIC->ui()->mainTemplate()->setOnScreenMessage('failure', base64_decode($error));
300  $DIC->ui()->mainTemplate()->setContent($form->getDynRegError());
301  return;
302  }
303  if ($form->checkInput()) {
304  $DIC->ctrl()->setParameter($this, "new_type", "");
305  $DIC->ui()->mainTemplate()->setContent($form->getDynRegRequest());
306  return;
307  }
308  $DIC->ui()->mainTemplate()->setContent($form->getHTML());
309  }
310 
311  public function cancelDynReg(): void
312  {
313  global $DIC;
315  throw new ilLtiConsumerException('permission denied!');
316  }
317  $new_type = $this->getRequestValue("new_type");
318  //$provider_id = $this->getRequestValue("provider_id");
319  if (ilSession::has('lti_dynamic_registration_client_id')) {
320  $providerId = ilLTIConsumeProvider::getProviderIdFromClientId(ilSession::get('lti_dynamic_registration_client_id'));
321  if ($providerId > 0) {
322  try {
324  //ToDo: check if provider is in use? should never happen...
325  $provider->delete();
326  } catch (\ILIAS\Filesystem\Exception\IOException $e) {
327  //ToDo: error handling
328  }
329  }
330  }
331  $DIC->ctrl()->setParameterByClass(ilRepositoryGUI::class, 'new_type', $new_type);
332  $DIC->ctrl()->redirectByClass(ilRepositoryGUI::class, 'create');
333  }
334 
335  public function showToolConfig(): void
336  {
337  global $DIC;
339  throw new ilLtiConsumerException('permission denied!');
340  }
341  $new_type = $this->getRequestValue("new_type");
342  $DIC->ctrl()->setParameter($this, "new_type", $new_type);
343  $provider_id = $this->getRequestValue("provider_id");
344  $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
345  $DIC->language()->loadLanguageModule($new_type);
346  $form = $this->initShowToolConfig($new_type, (int) $provider_id);
347  $DIC->ui()->mainTemplate()->setContent($form->getHTML());
348  }
349 
350  public function saveDynReg(): void
351  {
352  global $DIC;
354  throw new ilLtiConsumerException('permission denied!');
355  }
356  $new_type = $this->getRequestValue("new_type");
357  $DIC->ctrl()->setParameter($this, "new_type", $new_type);
358  $provider_id = $this->getRequestValue("provider_id");
359  $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
360  $DIC->language()->loadLanguageModule($new_type);
361  ilSession::clear('lti_dynamic_registration_client_id');
362  ilSession::clear('lti_dynamic_registration_custom_params');
363  $form = $this->initShowToolConfig($new_type, (int) $provider_id);
364  $form->setValuesByPost();
365  if ($form->checkInput()) { // update only overridable fields
366  $provider = $form->getProvider();
367  $form->initProvider($provider);
368  $provider->update();
369  // jump to provider selection is one option:
370  // $DIC->ctrl()->redirectByClass([ilRepositoryGUI::class, ilObjLTIConsumerGUI::class],"create");
371  // direct redirection to save is onle less click (there is a switch for save | contentSelection in GUI class):
372  $DIC->ctrl()->redirectByClass([ilRepositoryGUI::class, ilObjLTIConsumerGUI::class], "save");
373  return;
374  }
375  $DIC->ui()->mainTemplate()->setContent($form->getHTML());
376  }
377 
378  public function contentSelection(string $providerId, string $newType, string $refId, ilLTIConsumeProvider $provider): void
379  {
380  global $DIC;
382  throw new ilLtiConsumerException('permission denied!');
383  }
384  $DIC->ctrl()->setParameter($this, "new_type", $newType);
385  $DIC->ctrl()->setParameter($this, "provider_id", $providerId);
386  $DIC->ctrl()->setParameter($this, "ref_id", $refId);
387 
388  $form = new ilLTIConsumeProviderFormGUI($provider);
389  $formaction = $this->ctrl->getFormAction($this, "cancelContentSelection");
390  $DIC->ui()->mainTemplate()->setContent($form->getContentSelectionFrame($formaction));
391  }
392 
393  public function contentSelectionRequest(): void
394  {
395  global $DIC;
397  throw new ilLtiConsumerException('permission denied!');
398  }
399  $new_type = $this->getRequestValue("new_type");
400  $DIC->ctrl()->setParameter($this, "new_type", $new_type);
401  $provider_id = $this->getRequestValue("provider_id");
402  $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
403  $ref_id = $this->getRequestValue("ref_id");
404  $DIC->ctrl()->setParameter($this, "ref_id", $ref_id);
405  $DIC->language()->loadLanguageModule($new_type);
406  $provider = new ilLTIConsumeProvider((int) $provider_id);
407  $redirectUrl = $DIC->ctrl()->getLinkTarget($this, 'contentSelectionRequest');
408 
409  if (!ilSession::has('lti13_login_data')) {
410  $userIdLTI = ilCmiXapiUser::getIdent($provider->getPrivacyIdent(), $DIC->user()); //was: getIdentAsId
411  //$emailPrimary = ilCmiXapiUser::getIdent($provider->getPrivacyIdent(), $DIC->user());
412  $ltiMessageHint = (string) $ref_id . ":" . CLIENT_ID . ":" . base64_encode($redirectUrl);
413  $tplLogin = new ilTemplate("tpl.lti_initial_login.html", true, true, "Modules/LTIConsumer");
414  $tplLogin->setVariable("LTI_INITIAL_LOGIN_ACTION", $provider->getInitiateLogin());
415  $tplLogin->setVariable("ISS", ilObjLTIConsumer::getIliasHttpPath());
416  $tplLogin->setVariable("TARGET_LINK_URL", $provider->getProviderUrl());
417  $tplLogin->setVariable("LOGIN_HINT", $userIdLTI);
418  $tplLogin->setVariable("LTI_MESSAGE_HINT", $ltiMessageHint);
419  $tplLogin->setVariable("CLIENT_ID", $provider->getClientId());
420  $tplLogin->setVariable("LTI_DEPLOYMENT_ID", (string) $provider->getId());
421  echo $tplLogin->get();
422  exit; //TODO: no exit
423  } else {
424  $loginData = ilSession::get('lti13_login_data');
425  // ToDo: correct Link!! replace ILIAS_HTTP_PATH
426  $data = ilObjLTIConsumer::buildContentSelectionParameters($provider, (int) $ref_id, ilObjLTIConsumer::getIliasHttpPath() . "/" . $DIC->ctrl()->getLinkTarget($this, 'contentSelectionResponse'), $loginData['nonce']);
427  $tplContentSelection = new ilTemplate("tpl.lti_jwt_autosubmit.html", true, true, "Modules/LTIConsumer");
428  $tplContentSelection->setVariable("LTI_JWT_FORM_ACTION", $provider->getContentItemUrl());
429  $tplContentSelection->setVariable("LTI_JWT_ID_TOKEN", $data['id_token']);
430  $tplContentSelection->setVariable("LTI_JWT_STATE", $loginData['state']);
431  ilSession::clear('lti13_login_data');
432  echo $tplContentSelection->get();
433  exit; //TODO: no exit
434  }
435  }
436 
437  public function contentSelectionResponse(): void
438  {
439  global $DIC;
441  throw new ilLtiConsumerException('permission denied!');
442  }
443  $new_type = $this->getRequestValue("new_type");
444  $DIC->ctrl()->setParameter($this, "new_type", $new_type);
445  $provider_id = $this->getRequestValue("provider_id");
446  $DIC->ctrl()->setParameter($this, "provider_id", $provider_id);
447  $ref_id = $this->getRequestValue("ref_id");
448  $DIC->ctrl()->setParameter($this, "ref_id", $ref_id);
449  $DIC->language()->loadLanguageModule($new_type);
450  $token = '';
451  if ($DIC->http()->wrapper()->post()->has('JWT')) {
452  $token = $DIC->http()->wrapper()->post()->retrieve('JWT', $DIC->refinery()->kindlyTo()->string());
453  }
454  if ($DIC->http()->wrapper()->post()->has('jwt')) {
455  $token = $DIC->http()->wrapper()->post()->retrieve('jwt', $DIC->refinery()->kindlyTo()->string());
456  }
457  if (!empty($token)) {
458  $provider = new ilLTIConsumeProvider((int) $provider_id);
460  } else {
461  echo "no token";
462  exit;
463  //ToDo:
464  }
465  }
466 
467  public function cancelContentSelection(): void
468  {
469  global $DIC;
471  throw new ilLtiConsumerException('permission denied!');
472  }
473  $new_type = $this->getRequestValue("new_type");
474  $DIC->ctrl()->setParameterByClass(ilRepositoryGUI::class, 'new_type', $new_type);
475  $DIC->ctrl()->redirectByClass(ilRepositoryGUI::class, 'create');
476  }
477 
479  {
480  if ($provider->getKeyType() == 'RSA_KEY') {
481  $key = $provider->getPublicKey();
482  $keys = new Firebase\JWT\Key($key, "RS256");
483  } else {
484  $jwks = file_get_contents($provider->getPublicKeyset());
485  //ToDo: Errorhandling
486  $keyset = json_decode($jwks, true);
487  $keys = Firebase\JWT\JWK::parseKeySet($keyset);
488  }
489  $data = Firebase\JWT\JWT::decode($token, $keys);
490  //ilObjLTIConsumer::getLogger()->debug(var_export($data,TRUE));
491  $refId = $this->getRequestValue('ref_id');
492 
493  foreach ($data->{'https://purl.imsglobal.org/spec/lti-dl/claim/content_items'} as $item) {
494  $gui = new ilObjLTIConsumerGUI(0, self::REPOSITORY_NODE_ID, (int) $refId);
495  $description = "";
496  if (isset($item->description)) {
497  $description = $item->description;
498  }
499  $newObj = $gui->createNewObject('lti', $item->title, $description);
500  $dtpl = $gui->getDidacticTemplateVar("dtpl");
501  if ($dtpl) {
502  $newObj->applyDidacticTemplate($dtpl);
503  }
504 
505  $newObj->setProviderId($provider->getId());
506  $newObj->setProvider($provider);
507  // custom params
508  $customParams = [];
509  foreach ($item->{'custom'} as $key => $value) {
510  $customParams[] = $key . "=" . $value;
511  }
512  if (count($customParams) > 0) {
513  $newObj->setCustomParams(implode(";", $customParams));
514  }
515  $newObj->save();
516  $this->initMetadata($newObj);
517  }
519  $template = new ilTemplate('tpl.lti_content_selection_finished.html', true, true, 'Modules/LTIConsumer');
520  $redirect = ilObjLTIConsumer::getIliasHttpPath() . "/" . "goto.php?target=" . $type . "_" . $refId;
521  $template->setVariable("CONTENT_SELECTION_REDIRECT", $redirect);
522  echo $template->get();
523  exit;
524  }
525 
526  protected function afterSave(\ilObject $newObject): void
527  {
528  global $DIC; //check
529 
530  if ($DIC->http()->wrapper()->query()->has('provider_id')) {
531  $newObject->setProviderId((int) $DIC->http()->wrapper()->query()->retrieve('provider_id', $DIC->refinery()->kindlyTo()->int()));
532  $newObject->initProvider();
533  $newObject->save();
534 
535  $newObject->setTitle($newObject->getProvider()->getTitle());
536  $newObject->setMasteryScore($newObject->getProvider()->getMasteryScore());
537  $newObject->update();
538 
539  $this->initMetadata($newObject);
540 
541  $DIC->ctrl()->redirectByClass(ilLTIConsumerSettingsGUI::class);
542  }
543 
545  throw new ilLtiConsumerException('permission denied!');
546  }
547 
548  $form = $this->initCustomCreateForm($newObject->getType());
549 
550  if ($form->checkInput()) {
552  $form->initProvider($provider);
554  $provider->setIsGlobal(false);
555  $provider->setCreator($DIC->user()->getId());
556  $provider->save();
557 
558  $newObject->setProviderId($provider->getId());
559  $newObject->setProvider($provider);
560  $newObject->save();
561 
562  $newObject->setTitle($provider->getTitle());
563  $newObject->setMasteryScore($newObject->getProvider()->getMasteryScore());
564  $newObject->update();
565 
566  $this->initMetadata($newObject);
567 
568  $DIC->ctrl()->redirectByClass(ilObjLTIConsumerGUI::class);
569  }
570 
571  throw new ilLtiConsumerException(
572  'form validation seems to not have worked in ilObjLTIConsumer::saveCustom()!'
573  );
574  }
575 
576  public function initMetadata(\ilObject $object): void
577  {
578  $metadata = new ilMD($object->getId(), $object->getId(), $object->getType());
579 
580  $generalMetadata = $metadata->getGeneral();
581 
582  if (!$generalMetadata) {
583  $generalMetadata = $metadata->addGeneral();
584  }
585 
586  $generalMetadata->setTitle($object->getTitle());
587  $generalMetadata->save();
588 
589  $id = $generalMetadata->addIdentifier();
590  $id->setCatalog('ILIAS');
591  $id->setEntry('il__' . $object->getType() . '_' . $object->getId());
592  $id->save();
593 
594  $keywords = $object->getProvider()->getKeywordsArray();
595 
596  // language needed now
597  $ulang = $this->user->getLanguage();
598  $keywords = array($ulang => $keywords);
599 
600  ilMDKeyword::updateKeywords($generalMetadata, $keywords);
601  }
602 
607  protected function initHeaderAction(?string $a_sub_type = null, ?int $a_sub_id = null): ?\ilObjectListGUI
608  {
609  global $DIC;
610  /* @var \ILIAS\DI\Container $DIC */
611 
612  $return = parent::initHeaderAction($a_sub_type, $a_sub_id);
613 
614  if ($this->creation_mode) {
615  return $return;
616  }
617 
618  $validator = new ilCertificateDownloadValidator();
619  if ($validator->isCertificateDownloadable($DIC->user()->getId(), $this->object->getId())) {
620  $certLink = $DIC->ctrl()->getLinkTargetByClass(
621  [ilObjLTIConsumerGUI::class, ilLTIConsumerSettingsGUI::class],
623  );
624 
625  $DIC->language()->loadLanguageModule('certificate');
626 
627  $return->addCustomCommand($certLink, 'download_certificate');
628 
629  $return->addHeaderIcon(
630  'cert_icon',
631  ilUtil::getImagePath('standard/icon_cert.svg'),
632  $DIC->language()->txt('download_certificate'),
633  null,
634  null,
635  $certLink
636  );
637  }
638 
639  return $return;
640  }
641 
642  public static function _goto(string $a_target): void
643  {
644  global $DIC;
645  $main_tpl = $DIC->ui()->mainTemplate();
646  /* @var \ILIAS\DI\Container $DIC */
647  $err = $DIC['ilErr'];
648  /* @var ilErrorHandling $err */
649  $ctrl = $DIC->ctrl();
650  $request = $DIC->http()->request();
651  $access = $DIC->access();
652  $lng = $DIC->language();
653 
654  $targetParameters = explode('_', $a_target);
655  $id = (int) $targetParameters[0];
656 
657  if ($id <= 0) {
658  $err->raiseError($lng->txt('msg_no_perm_read'), $err->FATAL);
659  }
660 
661  if ($access->checkAccess('read', '', $id)) {
662  $ctrl->setTargetScript('ilias.php');
663  $ctrl->setParameterByClass(ilObjLTIConsumerGUI::class, 'ref_id', $id);
664  $ctrl->redirectByClass([ilRepositoryGUI::class, ilObjLTIConsumerGUI::class]);
665  } elseif ($access->checkAccess('visible', '', $id)) {
666  ilObjectGUI::_gotoRepositoryNode($id, 'infoScreen');
667  } elseif ($access->checkAccess('read', '', ROOT_FOLDER_ID)) {
668  $main_tpl->setOnScreenMessage(
669  'info',
670  sprintf(
671  $DIC->language()->txt('msg_no_perm_read_item'),
673  ),
674  true
675  );
676 
678  }
679 
680  $err->raiseError($DIC->language()->txt("msg_no_perm_read_lm"), $err->FATAL);
681  }
682 
686  public function executeCommand(): void
687  {
688  global $DIC;
689  /* @var \ILIAS\DI\Container $DIC */
690 
691  $ilErr = $DIC['ilErr'];
692 
694  $this->prepareOutput();
695  $this->addHeaderAction();
696  }
697 
698  if (!$this->creation_mode) {
699  $this->trackObjectReadEvent();
700  if ($this->object instanceof ilObjLTIConsumer && $this->object->getProvider()->hasProviderIcon()) {
701  $DIC->ui()->mainTemplate()->setTitleIcon(
702  $this->object->getProvider()->getProviderIcon()->getAbsoluteFilePath(),
703  'Icon ' . $this->object->getProvider()->getTitle()
704  );
705  }
706 
707  $link = ilLink::_getLink($this->object->getRefId(), $this->object->getType());
708  $navigationHistory = $DIC['ilNavigationHistory'];
709  /* @var ilNavigationHistory $navigationHistory */
710  $navigationHistory->addItem($this->object->getRefId(), $link, $this->object->getType());
711  }
712 
714  $obj = $this->object;
715 
716  switch ($DIC->ctrl()->getNextClass()) {
717  case strtolower(ilObjectCopyGUI::class):
718 
719  $gui = new ilObjectCopyGUI($this);
720  $gui->setType($this->getType());
721  $DIC->ctrl()->forwardCommand($gui);
722  break;
723 
724  case strtolower(ilCommonActionDispatcherGUI::class):
725 
727  $DIC->ctrl()->forwardCommand($gui);
728  break;
729 
730  case strtolower(ilLearningProgressGUI::class):
731 
732  if (!$DIC->access()->checkAccess('read', '', $this->object->getRefId())) {
733  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->WARNING);
734  } else {
735  $DIC->tabs()->activateTab(self::TAB_ID_LEARNING_PROGRESS);
736 
737  $gui = new ilLearningProgressGUI(
739  $this->object->getRefId()
740  );
741 
742  $DIC->ctrl()->forwardCommand($gui);
743  }
744 
745  break;
746 
747  case strtolower(ilObjectMetaDataGUI::class):
748 
749  if (!$DIC->access()->checkAccess('write', '', $this->object->getRefId())) {
750  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_write"), $ilErr->WARNING);
751  } else {
752 
753  $DIC->tabs()->activateTab(self::TAB_ID_METADATA);
754 
755  $gui = new ilObjectMetaDataGUI($obj);
756  $DIC->ctrl()->forwardCommand($gui);
757  }
758  break;
759 
760  case strtolower(ilPermissionGUI::class):
761 
762  $DIC->tabs()->activateTab(self::TAB_ID_PERMISSIONS);
763 
764  $gui = new ilPermissionGUI($this);
765  $DIC->ctrl()->forwardCommand($gui);
766  break;
767 
768  case strtolower(ilLTIConsumerSettingsGUI::class):
769 
770  if (!$DIC->access()->checkAccess('write', '', $this->object->getRefId())) {
771  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_write"), $ilErr->WARNING);
772  } else {
773  $DIC->tabs()->activateTab(self::TAB_ID_SETTINGS);
774 
775  $gui = new ilLTIConsumerSettingsGUI($obj, $this->ltiAccess);
776  $DIC->ctrl()->forwardCommand($gui);
777  }
778  break;
779 
780  case strtolower(ilLTIConsumerXapiStatementsGUI::class):
781 
782  if (!$DIC->access()->checkAccess('read', '', $this->object->getRefId())) {
783  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->WARNING);
784  } else {
785 
786  $DIC->tabs()->activateTab(self::TAB_ID_STATEMENTS);
787 
788  $gui = new ilLTIConsumerXapiStatementsGUI($obj);
789  $DIC->ctrl()->forwardCommand($gui);
790  }
791 
792  break;
793 
794  case strtolower(ilLTIConsumerScoringGUI::class):
795 
796  if (!$DIC->access()->checkAccess('read', '', $this->object->getRefId())) {
797  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->WARNING);
798  } else {
799  $DIC->tabs()->activateTab(self::TAB_ID_SCORING);
800 
801  $gui = new ilLTIConsumerScoringGUI($obj);
802  $DIC->ctrl()->forwardCommand($gui);
803  }
804 
805  break;
806 
807  case strtolower(ilLTIConsumerGradeSynchronizationGUI::class):
808 
809  if (!$DIC->access()->checkAccess('read', '', $this->object->getRefId())) {
810  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->WARNING);
811  } else {
812  $DIC->tabs()->activateTab(self::TAB_ID_GRADE_SYNCHRONIZATION);
813 
814  $gui = new ilLTIConsumerGradeSynchronizationGUI($obj);
815  $DIC->ctrl()->forwardCommand($gui);
816  }
817 
818  break;
819 
820  case strtolower(ilLTIConsumerContentGUI::class):
821 
822  if (!$DIC->access()->checkAccess('read', '', $this->object->getRefId())) {
823  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->WARNING);
824  } else {
825  $DIC->tabs()->activateTab(self::TAB_ID_CONTENT);
826 
827  $gui = new ilLTIConsumerContentGUI($obj);
828  $DIC->ctrl()->forwardCommand($gui);
829  }
830 
831  break;
832 
833  case strtolower(ilInfoScreenGUI::class):
834 
835  $DIC->tabs()->activateTab(self::TAB_ID_INFO);
836  $this->infoScreen();
837 
838  break;
839 
840  default:
841  if ($DIC->ctrl()->getCmd() === 'save') {
842  $this->checkContentSelection();
843  } else {
844  $command = $DIC->ctrl()->getCmd(self::DEFAULT_CMD);
845  $this->{$command}();
846  }
847  }
848  }
849 
850  protected function checkContentSelection(): void
851  {
852  global $DIC;
853  $providerId = $this->getRequestValue('provider_id');
854  $newType = $this->getRequestValue('new_type');
855  $refId = $this->getRequestValue('ref_id');
856  if ($providerId !== null && $newType == 'lti' && $refId != null) {
858  // check if post variables from contentSelectionResponse
859  if ($DIC->http()->wrapper()->post()->has('JWT')) {
860  // ToDo:
861  } else {
862  if ($provider->isContentItem() && !empty($provider->getContentItemUrl())) {
863  $this->contentSelection($providerId, $newType, $refId, $provider);
864  } else {
865  $this->save();
866  }
867  }
868  } else {
869  $this->save();
870  }
871  }
872 
873  protected function setTabs(): void
874  {
875  global $DIC;
876 
877  if (!$this->object instanceof ilObjLTIConsumer) {
878  return;
879  }
880  /* @var \ILIAS\DI\Container $DIC */
881  $DIC->language()->loadLanguageModule('lti');
882 
883  if (!$this->object->getOfflineStatus() &&
884  $this->object->getProvider()->getAvailability() != ilLTIConsumeProvider::AVAILABILITY_NONE
885  ) {
886  $DIC->tabs()->addTab(
887  self::TAB_ID_CONTENT,
888  $DIC->language()->txt(self::TAB_ID_CONTENT),
889  $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerContentGUI::class)
890  );
891  }
892 
893  $DIC->tabs()->addTab(
894  self::TAB_ID_INFO,
895  $DIC->language()->txt(self::TAB_ID_INFO),
896  $this->ctrl->getLinkTargetByClass(ilInfoScreenGUI::class)
897  );
898 
899  if ($this->ltiAccess->hasWriteAccess()) {
900  $DIC->tabs()->addTab(
901  self::TAB_ID_SETTINGS,
902  $DIC->language()->txt(self::TAB_ID_SETTINGS),
903  $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerSettingsGUI::class)
904  );
905  }
906 
907  if ($this->ltiAccess->hasStatementsAccess()) {
908  $DIC->tabs()->addTab(
909  self::TAB_ID_STATEMENTS,
910  $DIC->language()->txt(self::TAB_ID_STATEMENTS),
911  $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerXapiStatementsGUI::class)
912  );
913  }
914 
915  if ($this->ltiAccess->hasHighscoreAccess()) {
916  //$DIC->language()->loadLanguageModule('lti');
917  $DIC->tabs()->addTab(
918  self::TAB_ID_SCORING,
919  $DIC->language()->txt(self::TAB_ID_SCORING),
920  $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerScoringGUI::class)
921  );
922  }
923 
924  if ($this->object->getProvider()->isGradeSynchronization()) {
925  $DIC->tabs()->addTab(
926  self::TAB_ID_GRADE_SYNCHRONIZATION,
927  $DIC->language()->txt(self::TAB_ID_GRADE_SYNCHRONIZATION),
928  $DIC->ctrl()->getLinkTargetByClass(ilLTIConsumerGradeSynchronizationGUI::class)
929  );
930  }
931 
932  if ($this->ltiAccess->hasLearningProgressAccess() && $this->object->getProvider()->getHasOutcome()) {
933  $DIC->tabs()->addTab(
934  self::TAB_ID_LEARNING_PROGRESS,
935  $DIC->language()->txt(self::TAB_ID_LEARNING_PROGRESS),
936  $DIC->ctrl()->getLinkTargetByClass(ilLearningProgressGUI::class)
937  );
938  }
939 
940  if ($this->ltiAccess->hasWriteAccess()) {
941  $gui = new ilObjectMetaDataGUI($this->object);
942  $link = $gui->getTab();
943 
944  if (strlen($link)) {
945  $DIC->tabs()->addTab(
946  self::TAB_ID_METADATA,
947  $DIC->language()->txt('meta_data'),
948  $link
949  );
950  }
951  }
952 
953  if ($this->ltiAccess->hasEditPermissionsAccess()) {
954  $DIC->tabs()->addTab(
955  self::TAB_ID_PERMISSIONS,
956  $DIC->language()->txt(self::TAB_ID_PERMISSIONS),
957  $DIC->ctrl()->getLinkTargetByClass(ilPermissionGUI::class, 'perm')
958  );
959  }
960 
961  // if (defined('DEVMODE') && DEVMODE) {
962  // $DIC->tabs()->addTab(
963  // 'debug',
964  // 'DEBUG',
965  // $DIC->ctrl()->getLinkTarget($this, 'debug')
966  // );
967  // }
968  }
969 
970  // protected function debug(): void
971  // {
972  // global $DIC;
973  // /* @var \ILIAS\DI\Container $DIC */
974  //
975  // $DIC->tabs()->activateTab('debug');
976  //
977  // $filter = new ilCmiXapiStatementsReportFilter();
978  // $filter->setActivityId($this->object->getActivityId());
979  //
980  // $aggregateEndPointUrl = str_replace(
981  // 'data/xAPI',
982  // 'api/statements/aggregate',
983  // $this->object->getProvider()->getXapiLaunchUrl() // should be named endpoint not launch url
984  // );
985  //
986  // $linkBuilder = new ilCmiXapiHighscoreReportLinkBuilder(
987  // $this->object->getId(),
988  // $aggregateEndPointUrl,
989  // $filter
990  // );
991  //
992  // $basicAuth = ilCmiXapiLrsType::buildBasicAuth(
993  // $this->object->getProvider()->getXapiLaunchKey(),
994  // $this->object->getProvider()->getXapiLaunchSecret()
995  // );
996  //
997  // $request = new ilCmiXapiHighscoreReportRequest(
998  // $basicAuth,
999  // $linkBuilder
1000  // );
1001  //
1002  // try {
1003  // $report = $request->queryReport($this->object->getId());
1004  //
1005  // $DIC->ui()->mainTemplate()->setContent(
1006  // $report->getResponseDebug()
1007  // );
1008  //
1009  // //ilUtil::sendSuccess('Object ID: '.$this->object->getId());
1010  // $DIC->ui()->mainTemplate()->setOnScreenMessage('info', $linkBuilder->getPipelineDebug());
1011  // $DIC->ui()->mainTemplate()->setOnScreenMessage('question', '<pre>' . print_r($report->getTableData(), true) . '</pre>');
1012  // } catch (Exception $e) {
1013  // $this->tpl->setOnScreenMessage('failure', $e->getMessage());
1014  // }
1015  // }
1016 
1017  protected function addLocatorItems(): void
1018  {
1019  global $DIC;
1020  /* @var \ILIAS\DI\Container $DIC */
1021 
1022  $locator = $DIC['ilLocator'];
1023  /* @var ilLocatorGUI $locator */
1024  $locator->addItem(
1025  $this->object->getTitle(),
1026  $this->ctrl->getLinkTarget($this, self::DEFAULT_CMD),
1027  "",
1028  $this->object->getRefId()
1029  );
1030  }
1031 
1032  protected function trackObjectReadEvent(): void
1033  {
1034  global $DIC;
1035  /* @var \ILIAS\DI\Container $DIC */
1036 
1038  $this->object->getType(),
1039  $this->object->getRefId(),
1040  $this->object->getId(),
1041  $DIC->user()->getId()
1042  );
1043 
1044  ilLPStatusWrapper::_updateStatus($this->object->getId(), $DIC->user()->getId());
1045  }
1046 
1047  protected function launch(): void
1048  {
1050  $obj = $this->object;
1051  $this->tabs_gui->activateTab(self::TAB_ID_CONTENT);
1052  $gui = new ilLTIConsumerContentGUI($obj);
1053  $this->ctrl->forwardCommand($gui);
1054  }
1055 
1056  protected function infoScreen(): void
1057  {
1058  global $DIC;
1059  /* @var \ILIAS\DI\Container $DIC */
1060 
1061  $DIC->tabs()->activateTab(self::TAB_ID_INFO);
1062 
1063  $DIC->ctrl()->setCmd("showSummary");
1064  $DIC->ctrl()->setCmdClass("ilinfoscreengui");
1065  $this->infoScreenForward();
1066  }
1067 
1068  protected function infoScreenForward(): void
1069  {
1070  global $DIC;
1071  /* @var \ILIAS\DI\Container $DIC */
1072  $ilErr = $DIC['ilErr'];
1073  /* @var ilErrorHandling $ilErr */
1074 
1075  if (!$this->checkPermissionBool("visible") && !$this->checkPermissionBool("read")) {
1076  $ilErr->raiseError($DIC->language()->txt("msg_no_perm_read"), $ilErr->MESSAGE);
1077  }
1078 
1079  $this->handleAvailablityMessage();
1080 
1081  $info = new ilInfoScreenGUI($this);
1082 
1083  $info->enablePrivateNotes();
1084 
1085  if ($this->checkPermissionBool("read")) {
1086  $info->enableNews();
1087  }
1088 
1089  $info->enableNewsEditing(false);
1090 
1091  if ($this->checkPermissionBool("write")) {
1092  $news_set = new ilSetting("news");
1093  $enable_internal_rss = $news_set->get("enable_rss_for_internal");
1094 
1095  if ($enable_internal_rss) {
1096  //todo check
1097  $info->setBlockProperty("news", "settings", "true");
1098  $info->setBlockProperty("news", "public_notifications_option", "true");
1099  }
1100  }
1101 
1102  // standard meta data
1103  $info->addMetaDataSections($this->object->getId(), 0, $this->object->getType());
1104 
1105  if (DEVMODE) {
1106  // Development Info
1107  $info->addSection('DEVMODE Info');
1108  $info->addProperty('Local Object ID', (string) $this->object->getId());
1109  $info->addProperty('Current User ID', (string) $DIC->user()->getId());
1110  }
1111  if ($this->object->getProvider()->getHasOutcome() && ilLPObjSettings::_lookupDBMode($this->object->getId()) != 0) {
1112  $info->addSection($DIC->language()->txt("lti_info_learning_progress_section"));
1113  $info->addProperty(
1114  $DIC->language()->txt("mastery_score"),
1115  ($this->object->getMasteryScorePercent()) . ' %'
1116  );
1117  }
1118 
1119  // LTI Ressource Info about privacy
1120  $info->addSection($DIC->language()->txt("lti_info_privacy_section"));
1121 
1122  $info->addProperty(
1123  $DIC->language()->txt("lti_con_prov_url"),
1124  $this->object->getProvider()->getProviderUrl()
1125  );
1126 
1127  $info->addProperty(
1128  $DIC->language()->txt("clti_privacy_name"),
1129  $DIC->language()->txt('clti_privacy_name_' . ilObjCmiXapiGUI::getPrivacyNameString($this->object->getProvider()->getPrivacyName()))
1130  );
1131 
1132  $info->addProperty(
1133  $DIC->language()->txt("clti_privacy_ident"),
1134  $DIC->language()->txt('clti_privacy_ident_' . ilObjCmiXapiGUI::getPrivacyIdentString($this->object->getProvider()->getPrivacyIdent()))
1135  );
1136  if ($this->object->getProvider()->isExternalProvider()) {
1137  $info->addProperty(
1138  $DIC->language()->txt("lti_info_external_provider_label"),
1139  $DIC->language()->txt('lti_info_external_provider_info')
1140  );
1141  }
1142 
1143  if ($this->object->getProvider()->getUseXapi()) {
1144  $info->addProperty(
1145  $DIC->language()->txt("lti_con_prov_xapi_launch_url"),
1146  $this->object->getProvider()->getXapiLaunchUrl()
1147  );
1148  }
1149 
1150  // FINISHED INFO SCREEN, NOW FORWARD
1151  $this->ctrl->forwardCommand($info);
1152  }
1153 
1154  protected function handleAvailablityMessage(): void
1155  {
1156  global $DIC;
1157  /* @var \ILIAS\DI\Container $DIC */
1158  if ($this->object->getProvider()->getProviderUrl() == '') {
1159  $this->tpl->setOnScreenMessage('failure', $DIC->language()->txt('lti_provider_not_set_msg'));
1160  } elseif ($this->object->getProvider()->getAvailability() == ilLTIConsumeProvider::AVAILABILITY_NONE) {
1161  $this->tpl->setOnScreenMessage('failure', $DIC->language()->txt('lti_provider_not_avail_msg'));
1162  }
1163  }
1164 
1165  protected function getRequestValue(string $key): ?string
1166  {
1167  if ($this->request_wrapper->has($key)) {
1168  return $this->request_wrapper->retrieve($key, $this->refinery->kindlyTo()->string());
1169  }
1170  return null;
1171  }
1172 }
static get(string $a_var)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ilLTIConsumerAccess $ltiAccess
exit
Definition: login.php:29
Class ilInfoScreenGUI.
redirectByClass( $a_class, string $a_cmd=null, string $a_anchor=null, bool $is_async=false)
ilErrorHandling $error
executeCommand()
execute command
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
New implementation of ilObjectGUI.
GUI class for the workflow of copying objects.
const ROOT_FOLDER_ID
Definition: constants.php:32
addGeneral()
Definition: class.ilMD.php:44
createNewObject(string $newType, string $title, string $description)
Class ChatMainBarProvider .
checkAccess(string $a_permission, string $a_cmd, int $a_ref_id, string $a_type="", ?int $a_obj_id=null, ?int $a_tree_id=null)
check access for an object (provide $a_type and $a_obj_id if available for better performance) ...
static getImagePath(string $img, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
initHeaderAction(?string $a_sub_type=null, ?int $a_sub_id=null)
getDidacticTemplateVar(string $type)
Get didactic template setting from creation screen.
static _gotoRepositoryNode(int $ref_id, string $cmd="")
contentSelection(string $providerId, string $newType, string $refId, ilLTIConsumeProvider $provider)
setParameterByClass(string $a_class, string $a_parameter, $a_value)
$refId
Definition: xapitoken.php:58
prepareOutput(bool $show_sub_objects=true)
if(empty($clientId)) $providerId
Definition: ltitoken.php:82
setTitle(string $title)
createObject()
create new object form
static buildContentSelectionParameters(ilLTIConsumeProvider $provider, int $refId, string $returnUrl, string $nonce)
putObjectInTree(ilObject $obj, int $parent_node_id=null)
Add object to tree at given position.
saveContentSelection(ilLTIConsumeProvider $provider, string $token)
static getIdent(int $userIdentMode, ilObjUser $user)
initShowToolConfig(string $a_new_type, int $a_provider_id)
$ilErr
Definition: raiseError.php:17
static getProviderIdFromClientId(string $clientId)
static getTypeByRefId(int $ref_id, bool $stop_on_error=true)
get object type by reference id
static _lookupObjId(int $ref_id)
static updateKeywords(ilMDGeneral $a_md_section, array $a_keywords)
global $DIC
Definition: feed.php:28
$provider
Definition: ltitoken.php:83
__construct(VocabulariesInterface $vocabularies)
checkPermissionBool(string $perm, string $cmd="", string $type="", ?int $node_id=null)
static _lookupTitle(int $obj_id)
static getPrivacyIdentString(int $ident)
buildProviderSelectionForm(string $a_new_type)
$token
Definition: xapitoken.php:70
static getPrivacyNameString(int $ident)
initCustomCreateForm(string $a_new_type)
ServerRequestInterface $request
initCreationForms(string $a_new_type)
Validates if an active certificate is stored in the database and can be downloaded by the user...
const CLIENT_ID
Definition: constants.php:41
static _recordReadEvent(string $a_type, int $a_ref_id, int $obj_id, int $usr_id, bool $isCatchupWriteEvents=true, $a_ext_rc=null, $a_ext_time=null)
afterSave(\ilObject $newObject)
static array static decode(string $jwt, $keyOrKeyArray, stdClass &$headers=null)
Decodes a JWT string into a PHP object.
Definition: JWT.php:96
string $key
Consumer key/client ID value.
Definition: System.php:193
static has($a_var)
const const static parseKeySet(array $jwks, string $defaultAlg=null)
Parse a set of JWK keys.
Definition: JWK.php:55
static _goto(string $a_target)
static _lookupDBMode(int $a_obj_id)
$ltiMessageHint
Definition: ltiauth.php:51
initDynRegForm(string $a_new_type)
setTargetScript(string $a_target_script)
getGeneral()
Definition: class.ilMD.php:34
addItem(string $a_title, string $a_link, string $a_frame="", int $a_ref_id=0, ?string $type=null)
ilLocatorGUI $locator
__construct(int $a_id=0, int $a_id_type=self::REPOSITORY_NODE_ID, int $a_parent_node_id=0)
New PermissionGUI (extends from old ilPermission2GUI) RBAC related output.
addHeaderAction()
Add header action menu.
static clear(string $a_var)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
static _gotoRepositoryRoot(bool $raise_error=false)
Goto repository root.
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
initCreateForm(string $a_new_type)
ilAccessHandler $access