The consumer, resource link and user objects will be initialised if the request is valid.
foreach ($this->constraints as $name => $constraint) { if ($constraint['required']) { if (!in_array($name, $capabilities) && !in_array($name, array_flip($capabilities))) { $missing[$name] = true; } } } if (!empty($missing)) { ksort($missing); $this->reason = 'Required capability not offered - \'' . implode('\', \'', array_keys($missing)) . '\''; $this->ok = false; }
303 {
304
305
306 $doSaveConsumer = false;
307
308 $this->ok = isset(
$_POST[
'lti_message_type']) && array_key_exists(
$_POST[
'lti_message_type'], self::$MESSAGE_TYPES);
309 if (!$this->ok) {
310 $this->reason = 'Invalid or missing lti_message_type parameter.';
311 }
312 if ($this->ok) {
313 $this->ok = isset(
$_POST[
'lti_version']) && in_array(
$_POST[
'lti_version'], self::$LTI_VERSIONS);
314 if (!$this->ok) {
315 $this->reason = 'Invalid or missing lti_version parameter.';
316 }
317 }
318 if ($this->ok) {
319 if (
$_POST[
'lti_message_type'] ===
'basic-lti-launch-request') {
320 $this->ok = isset(
$_POST[
'resource_link_id']) && (strlen(trim(
$_POST[
'resource_link_id'])) > 0);
321 if (!$this->ok) {
322 $this->reason = 'Missing resource link ID.';
323 }
324 } elseif (
$_POST[
'lti_message_type'] ===
'ContentItemSelectionRequest') {
325 if (isset(
$_POST[
'accept_media_types']) && (strlen(trim(
$_POST[
'accept_media_types'])) > 0)) {
326 $mediaTypes = array_filter(explode(
',', str_replace(
' ',
'',
$_POST[
'accept_media_types'])),
'strlen');
327 $mediaTypes = array_unique($mediaTypes);
328 $this->ok = count($mediaTypes) > 0;
329 if (!$this->ok) {
330 $this->reason = 'No accept_media_types found.';
331 } else {
332 $this->mediaTypes = $mediaTypes;
333 }
334 } else {
335 $this->ok = false;
336 }
337 if ($this->ok && isset(
$_POST[
'accept_presentation_document_targets']) && (strlen(trim(
$_POST[
'accept_presentation_document_targets'])) > 0)) {
338 $documentTargets = array_filter(explode(
',', str_replace(
' ',
'',
$_POST[
'accept_presentation_document_targets'])),
'strlen');
339 $documentTargets = array_unique($documentTargets);
340 $this->ok = count($documentTargets) > 0;
341 if (!$this->ok) {
342 $this->reason = 'Missing or empty accept_presentation_document_targets parameter.';
343 } else {
344 foreach ($documentTargets as $documentTarget) {
346 $documentTarget,
347 array('embed', 'frame', 'iframe', 'window', 'popup', 'overlay', 'none'),
348 'Invalid value in accept_presentation_document_targets parameter: %s.'
349 );
350 if (!$this->ok) {
351 break;
352 }
353 }
354 if ($this->ok) {
355 $this->documentTargets = $documentTargets;
356 }
357 }
358 } else {
359 $this->ok = false;
360 }
361 if ($this->ok) {
362 $this->ok = isset(
$_POST[
'content_item_return_url']) && (strlen(trim(
$_POST[
'content_item_return_url'])) > 0);
363 if (!$this->ok) {
364 $this->reason = 'Missing content_item_return_url parameter.';
365 }
366 }
367 } elseif (
$_POST[
'lti_message_type'] ==
'ToolProxyRegistrationRequest') {
368 $this->ok = ((isset(
$_POST[
'reg_key']) && (strlen(trim(
$_POST[
'reg_key'])) > 0)) &&
369 (isset(
$_POST[
'reg_password']) && (strlen(trim(
$_POST[
'reg_password'])) > 0)) &&
370 (isset(
$_POST[
'tc_profile_url']) && (strlen(trim(
$_POST[
'tc_profile_url'])) > 0)) &&
371 (isset(
$_POST[
'launch_presentation_return_url']) && (strlen(trim(
$_POST[
'launch_presentation_return_url'])) > 0)));
372 if ($this->debugMode && !$this->ok) {
373 $this->reason = 'Missing message parameters.';
374 }
375 }
376 }
377 $now = time();
378
379 $this->logger->debug('Checking consumer key...');
380
381
382 if ($this->ok && (
$_POST[
'lti_message_type'] !=
'ToolProxyRegistrationRequest')) {
383 $this->ok = isset(
$_POST[
'oauth_consumer_key']);
384 if (!$this->ok) {
385 $this->reason = 'Missing consumer key.';
386 }
387 if ($this->ok) {
388
390 $this->ok = !is_null($this->consumer->created);
391 if (!$this->ok) {
392 $this->reason = 'Invalid consumer key.';
393 }
394 }
395 if ($this->ok) {
396 $today =
date(
'Y-m-d', $now);
397 if (is_null($this->consumer->lastAccess)) {
398 $doSaveConsumer = true;
399 } else {
400 $last =
date(
'Y-m-d', $this->consumer->lastAccess);
401 $doSaveConsumer = $doSaveConsumer || ($last !== $today);
402 }
403 $this->consumer->last_access = $now;
404 try {
407 $method = new OAuth\OAuthSignatureMethod_HMAC_SHA1();
408 $server->add_signature_method($method);
409 $request = OAuth\OAuthRequest::from_request();
411 } catch (\Exception $e) {
412 $this->ok = false;
413 if (empty($this->reason)) {
414 if ($this->debugMode) {
415 $consumer =
new OAuth\OAuthConsumer($this->consumer->getKey(), $this->consumer->secret);
416 $signature = $request->build_signature($method,
$consumer,
false);
417 $this->reason = $e->getMessage();
418 if (empty($this->reason)) {
419 $this->reason = 'OAuth exception';
420 }
421 $this->details[] = 'Timestamp: ' . time();
422 $this->details[] = "Signature: {$signature}";
423 $this->details[] = "Base string: {$request->base_string}]";
424 } else {
425 $this->reason = 'OAuth signature check failed - perhaps an incorrect secret or timestamp.';
426 }
427 }
428 }
429 }
430
431 if ($this->ok) {
432 $today =
date(
'Y-m-d', $now);
433 if (is_null($this->consumer->lastAccess)) {
434 $doSaveConsumer = true;
435 } else {
436 $last =
date(
'Y-m-d', $this->consumer->lastAccess);
437 $doSaveConsumer = $doSaveConsumer || ($last !== $today);
438 }
439 $this->consumer->last_access = $now;
440 if ($this->consumer->protected) {
441 if (!is_null($this->consumer->consumerGuid)) {
442 $this->ok = empty(
$_POST[
'tool_consumer_instance_guid']) ||
443 ($this->consumer->consumerGuid ===
$_POST[
'tool_consumer_instance_guid']);
444 if (!$this->ok) {
445 $this->reason = 'Request is from an invalid tool consumer.';
446 }
447 } else {
448 $this->ok = isset(
$_POST[
'tool_consumer_instance_guid']);
449 if (!$this->ok) {
450 $this->reason = 'A tool consumer GUID must be included in the launch request.';
451 }
452 }
453 }
454 if ($this->ok) {
455 $this->ok = $this->consumer->enabled;
456 if (!$this->ok) {
457 $this->reason = 'Tool consumer has not been enabled by the tool provider.';
458 }
459 }
460 if ($this->ok) {
461 $this->ok = is_null($this->consumer->enableFrom) || ($this->consumer->enableFrom <= $now);
462 if ($this->ok) {
463 $this->ok = is_null($this->consumer->enableUntil) || ($this->consumer->enableUntil > $now);
464 if (!$this->ok) {
465 $this->reason = 'Tool consumer access has expired.';
466 }
467 } else {
468 $this->reason = 'Tool consumer access is not yet available.';
469 }
470 }
471 }
472
473 if ($this->ok) {
474 if (
$_POST[
'lti_message_type'] ===
'ContentItemSelectionRequest') {
475 if (isset(
$_POST[
'accept_unsigned'])) {
476 $this->ok = $this->
checkValue(
$_POST[
'accept_unsigned'], array(
'true',
'false'),
'Invalid value for accept_unsigned parameter: %s.');
477 }
478 if ($this->ok && isset(
$_POST[
'accept_multiple'])) {
479 $this->ok = $this->
checkValue(
$_POST[
'accept_multiple'], array(
'true',
'false'),
'Invalid value for accept_multiple parameter: %s.');
480 }
481 if ($this->ok && isset(
$_POST[
'accept_copy_advice'])) {
482 $this->ok = $this->
checkValue(
$_POST[
'accept_copy_advice'], array(
'true',
'false'),
'Invalid value for accept_copy_advice parameter: %s.');
483 }
484 if ($this->ok && isset(
$_POST[
'auto_create'])) {
485 $this->ok = $this->
checkValue(
$_POST[
'auto_create'], array(
'true',
'false'),
'Invalid value for auto_create parameter: %s.');
486 }
487 if ($this->ok && isset(
$_POST[
'can_confirm'])) {
488 $this->ok = $this->
checkValue(
$_POST[
'can_confirm'], array(
'true',
'false'),
'Invalid value for can_confirm parameter: %s.');
489 }
490 } elseif (isset(
$_POST[
'launch_presentation_document_target'])) {
492 $_POST[
'launch_presentation_document_target'],
493 array('embed', 'frame', 'iframe', 'window', 'popup', 'overlay'),
494 'Invalid value for launch_presentation_document_target parameter: %s.'
495 );
496 }
497 }
498 }
499
500 if ($this->ok && (
$_POST[
'lti_message_type'] ===
'ToolProxyRegistrationRequest')) {
501 $this->ok =
$_POST[
'lti_version'] == self::LTI_VERSION2;
502 if (!$this->ok) {
503 $this->reason = 'Invalid lti_version parameter';
504 }
505 if ($this->ok) {
506 $http =
new HTTPMessage(
$_POST[
'tc_profile_url'],
'GET',
null,
'Accept: application/vnd.ims.lti.v2.toolconsumerprofile+json');
507 $this->ok =
$http->send();
508 if (!$this->ok) {
509 $this->reason = 'Tool consumer profile not accessible.';
510 } else {
511 $tcProfile = json_decode(
$http->response);
512 $this->ok = !is_null($tcProfile);
513 if (!$this->ok) {
514 $this->reason = 'Invalid JSON in tool consumer profile.';
515 }
516 }
517 }
518
519 if ($this->ok) {
520
522 $this->consumer->profile = $tcProfile;
523 $capabilities = $this->consumer->profile->capability_offered;
524 $missing = array();
525 foreach ($this->resourceHandlers as $resourceHandler) {
526 foreach ($resourceHandler->requiredMessages as
$message) {
527 if (!in_array(
$message->type, $capabilities)) {
529 }
530 }
531 }
532
547 }
548
549 if ($this->ok) {
550 foreach ($this->requiredServices as
$service) {
553 if ($this->ok) {
554 $this->reason = 'Required service(s) not offered - ';
555 $this->ok = false;
556 } else {
557 $this->reason .= ', ';
558 }
559 $this->reason .=
"'{$format}' [" . implode(
', ',
$service->actions) .
']';
560 }
561 }
562 }
563 }
564 if ($this->ok) {
565 if (
$_POST[
'lti_message_type'] ===
'ToolProxyRegistrationRequest') {
566 $this->consumer->profile = $tcProfile;
567 $this->consumer->secret =
$_POST[
'reg_password'];
568 $this->consumer->ltiVersion =
$_POST[
'lti_version'];
569 $this->consumer->name = $tcProfile->product_instance->service_owner->service_owner_name->default_value;
570 $this->consumer->consumerName = $this->consumer->name;
571 $this->consumer->consumerVersion = "{$tcProfile->product_instance->product_info->product_family->code}-{$tcProfile->product_instance->product_info->product_version}";
572 $this->consumer->consumerGuid = $tcProfile->product_instance->guid;
573 $this->consumer->enabled = true;
574 $this->consumer->protected = true;
575 $doSaveConsumer = true;
576 }
577 }
578 } elseif ($this->ok && !empty(
$_POST[
'custom_tc_profile_url']) && empty($this->consumer->profile)) {
579 $http =
new HTTPMessage(
$_POST[
'custom_tc_profile_url'],
'GET',
null,
'Accept: application/vnd.ims.lti.v2.toolconsumerprofile+json');
581 $tcProfile = json_decode(
$http->response);
582 if (!is_null($tcProfile)) {
583 $this->consumer->profile = $tcProfile;
584 $doSaveConsumer = true;
585 }
586 }
587 }
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616 $this->logger->debug('Still ok: ' . ($this->ok ? '1' : '0'));
617 if (!$this->ok) {
618 $this->logger->debug('Reason: ' . $this->reason);
619 }
620
621 if ($this->ok) {
622
623
624 if (isset(
$_POST[
'context_id'])) {
625 $this->context = Context::fromConsumer($this->consumer, trim(
$_POST[
'context_id']));
627 if (isset(
$_POST[
'context_title'])) {
629 }
631 $title =
"Course {$this->context->getId()}";
632 }
633 $this->context->title =
$title;
634 }
635
636
637 if (isset(
$_POST[
'resource_link_id'])) {
638 $contentItemId = '';
639 if (isset(
$_POST[
'custom_content_item_id'])) {
640 $contentItemId =
$_POST[
'custom_content_item_id'];
641 }
642 $this->resourceLink = ResourceLink::fromConsumer($this->consumer, trim(
$_POST[
'resource_link_id']), $contentItemId);
643 if (!empty($this->context)) {
644 $this->resourceLink->setContextId($this->context->getRecordId());
645 }
647 if (isset(
$_POST[
'resource_link_title'])) {
649 }
651 $title =
"Resource {$this->resourceLink->getId()}";
652 }
653 $this->resourceLink->title =
$title;
654
655 foreach ($this->consumer->getSettings() as
$name => $value) {
656 if (strpos(
$name,
'custom_') === 0) {
657 $this->consumer->setSetting(
$name);
658 $doSaveConsumer = true;
659 }
660 }
661 if (!empty($this->context)) {
662 foreach ($this->context->getSettings() as
$name => $value) {
663 if (strpos(
$name,
'custom_') === 0) {
664 $this->context->setSetting(
$name);
665 }
666 }
667 }
668 foreach ($this->resourceLink->getSettings() as
$name => $value) {
669 if (strpos(
$name,
'custom_') === 0) {
670 $this->resourceLink->setSetting(
$name);
671 }
672 }
673
674 foreach (self::$LTI_CONSUMER_SETTING_NAMES as
$name) {
677 } else {
678 $this->consumer->setSetting(
$name);
679 }
680 }
681 if (!empty($this->context)) {
682 foreach (self::$LTI_CONTEXT_SETTING_NAMES as
$name) {
685 } else {
686 $this->context->setSetting(
$name);
687 }
688 }
689 }
690 foreach (self::$LTI_RESOURCE_LINK_SETTING_NAMES as
$name) {
693 } else {
694 $this->resourceLink->setSetting(
$name);
695 }
696 }
697
699 if ((strpos(
$name,
'custom_') === 0) &&
700 !in_array(
$name, array_merge(self::$LTI_CONSUMER_SETTING_NAMES, self::$LTI_CONTEXT_SETTING_NAMES, self::$LTI_RESOURCE_LINK_SETTING_NAMES))) {
701 $this->resourceLink->setSetting(
$name, $value);
702 }
703 }
704 }
705
706
707 $userId = '';
708 if (isset(
$_POST[
'user_id'])) {
709 $userId = trim(
$_POST[
'user_id']);
710 }
711
712 $this->
user = User::fromResourceLink($this->resourceLink, $userId);
713
714
715 $firstname = (isset(
$_POST[
'lis_person_name_given'])) ?
$_POST[
'lis_person_name_given'] :
'';
716 $lastname = (isset(
$_POST[
'lis_person_name_family'])) ?
$_POST[
'lis_person_name_family'] :
'';
717 $fullname = (isset(
$_POST[
'lis_person_name_full'])) ?
$_POST[
'lis_person_name_full'] :
'';
718 $this->
user->setNames($firstname, $lastname, $fullname);
719
720
721 $email = (isset(
$_POST[
'lis_person_contact_email_primary'])) ?
$_POST[
'lis_person_contact_email_primary'] :
'';
722 $this->
user->setEmail(
$email, $this->defaultEmail);
723
724
725 if (isset(
$_POST[
'user_image'])) {
727 }
728
729
730 if (isset(
$_POST[
'roles'])) {
731 $this->
user->roles = self::parseRoles(
$_POST[
'roles']);
732 }
733
734
735 $this->consumer->defaultEmail = $this->defaultEmail;
736 if ($this->consumer->ltiVersion !==
$_POST[
'lti_version']) {
737 $this->consumer->ltiVersion =
$_POST[
'lti_version'];
738 $doSaveConsumer = true;
739 }
740 if (isset(
$_POST[
'tool_consumer_instance_name'])) {
741 if ($this->consumer->consumerName !==
$_POST[
'tool_consumer_instance_name']) {
742 $this->consumer->consumerName =
$_POST[
'tool_consumer_instance_name'];
743 $doSaveConsumer = true;
744 }
745 }
746 if (isset(
$_POST[
'tool_consumer_info_product_family_code'])) {
748 if (isset(
$_POST[
'tool_consumer_info_version'])) {
749 $version .=
"-{$_POST['tool_consumer_info_version']}";
750 }
751
752 if ($this->consumer->consumerVersion !==
$version) {
753 $this->consumer->consumerVersion =
$version;
754 $doSaveConsumer = true;
755 }
756 } elseif (isset(
$_POST[
'ext_lms']) && ($this->consumer->consumerName !==
$_POST[
'ext_lms'])) {
757 $this->consumer->consumerVersion =
$_POST[
'ext_lms'];
758 $doSaveConsumer = true;
759 }
760 if (isset(
$_POST[
'tool_consumer_instance_guid'])) {
761 if (is_null($this->consumer->consumerGuid)) {
762 $this->consumer->consumerGuid =
$_POST[
'tool_consumer_instance_guid'];
763 $doSaveConsumer = true;
764 } elseif (!$this->consumer->protected) {
765 $doSaveConsumer = ($this->consumer->consumerGuid !==
$_POST[
'tool_consumer_instance_guid']);
766 if ($doSaveConsumer) {
767 $this->consumer->consumerGuid =
$_POST[
'tool_consumer_instance_guid'];
768 }
769 }
770 }
771 if (isset(
$_POST[
'launch_presentation_css_url'])) {
772 if ($this->consumer->cssPath !==
$_POST[
'launch_presentation_css_url']) {
773 $this->consumer->cssPath =
$_POST[
'launch_presentation_css_url'];
774 $doSaveConsumer = true;
775 }
776 } elseif (isset(
$_POST[
'ext_launch_presentation_css_url']) &&
777 ($this->consumer->cssPath !==
$_POST[
'ext_launch_presentation_css_url'])) {
778 $this->consumer->cssPath =
$_POST[
'ext_launch_presentation_css_url'];
779 $doSaveConsumer = true;
780 } elseif (!empty($this->consumer->cssPath)) {
781 $this->consumer->cssPath = null;
782 $doSaveConsumer = true;
783 }
784 }
785
786
787 if ($doSaveConsumer) {
788 $this->consumer->save();
789 }
790 if ($this->ok && isset($this->context)) {
791 $this->context->save();
792 }
793
794 $this->logger->dump(get_class($this->context));
795
796
797 if ($this->ok && isset($this->resourceLink)) {
798
799
800
801
802 $this->resourceLink->save();
803
804
805 if (isset(
$_POST[
'lis_result_sourcedid'])) {
806 if ($this->
user->ltiResultSourcedId !==
$_POST[
'lis_result_sourcedid']) {
807 $this->
user->ltiResultSourcedId =
$_POST[
'lis_result_sourcedid'];
809 }
810 } elseif (!empty($this->
user->ltiResultSourcedId)) {
811 $this->
user->ltiResultSourcedId =
'';
813 }
814 }
815
817 }
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
Class to represent an HTTP message.
Class to represent an OAuth Data Store.
if(! $oauthconfig->getBoolean('getUserInfo.enable', FALSE)) $store
catch(Exception $e) $message
foreach($_POST as $key=> $value) $res