From 6a115bab9c7a905dc6943f6a18b7930c5c9fda6b Mon Sep 17 00:00:00 2001 From: heutelbeck Date: Tue, 18 Feb 2020 13:20:17 +0100 Subject: [PATCH 1/7] ignore eclipse specific files as well --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index aa7a307..da544d7 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,9 @@ *.zip *.tar.gz *.rar +.settings +.classpath +.project # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* From 14c3f00cfec3c442ed0174d6daede5ca44dcbd19 Mon Sep 17 00:00:00 2001 From: heutelbeck Date: Tue, 18 Feb 2020 13:22:29 +0100 Subject: [PATCH 2/7] JDK13 compatibility fix - mockito version bump for JDK13 compatibility - lombok version bump for JDK13 compatibility - compiler plugin version added - formatting --- pom.xml | 147 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 75 insertions(+), 72 deletions(-) diff --git a/pom.xml b/pom.xml index a791fd0..62ea9eb 100644 --- a/pom.xml +++ b/pom.xml @@ -1,78 +1,81 @@ - - 4.0.0 + + 4.0.0 - edu.uoc.elc.lti - lti-1.3 - jar + edu.uoc.elc.lti + lti-1.3 + jar - lti - 0.0.2 - http://maven.apache.org + lti + 0.0.2 + http://maven.apache.org - - UTF-8 - UTF-8 - 1.8 - 1.8 - + + UTF-8 + UTF-8 + 1.8 + 1.8 + - - - edu.uoc.elc.lti - lti-1.3-core - 0.0.2 - - - com.fasterxml.jackson.core - jackson-databind - 2.9.10.1 - - - org.projectlombok - lombok - 1.16.10 - provided - - - junit - junit - 4.12 - test - - - org.mockito - mockito-core - 2.15.0 - - - edu.uoc.elc.lti - lti-1.3-jwt - 0.0.2 - test - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - 2.9.0 - - - commons-io - commons-io - 2.6 - compile - - + + + edu.uoc.elc.lti + lti-1.3-core + 0.0.2 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.10.1 + + + org.projectlombok + lombok + 1.18.12 + provided + + + junit + junit + 4.12 + test + + + org.mockito + mockito-core + 3.2.4 + + + edu.uoc.elc.lti + lti-1.3-jwt + 0.0.2 + test + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.9.0 + + + commons-io + commons-io + 2.6 + compile + + - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + From 9fb7ec84f90097f123811a16a8488e1935d0d36a Mon Sep 17 00:00:00 2001 From: heutelbeck Date: Tue, 18 Feb 2020 13:23:00 +0100 Subject: [PATCH 3/7] organize and cleanup imports --- .../java/edu/uoc/elc/lti/platform/Member.java | 5 +++-- .../lti/platform/NamesRoleServiceResponse.java | 4 ++-- .../uoc/elc/lti/platform/PlatformClient.java | 7 ++++--- .../accesstoken/AccessTokenRequestHandler.java | 12 ++++++------ .../accesstoken/AccessTokenResponse.java | 1 + .../elc/lti/platform/ags/AgsClientFactory.java | 6 +++--- .../ags/GenericResultServiceClient.java | 4 ++-- .../ags/ToolLineItemServiceClient.java | 6 +++--- .../deeplinking/DeepLinkingClient.java | 10 +++++----- .../deeplinking/FileItemValidator.java | 4 ++-- .../platform/deeplinking/ItemValidator.java | 4 ++-- .../elc/lti/tool/AssignmentGradeService.java | 4 ++-- .../tool/AuthenticationResponseValidator.java | 9 ++++----- .../java/edu/uoc/elc/lti/tool/Context.java | 4 ++-- .../edu/uoc/elc/lti/tool/LaunchValidator.java | 7 ------- .../edu/uoc/elc/lti/tool/NamesRoleService.java | 4 ++-- src/main/java/edu/uoc/elc/lti/tool/Tool.java | 18 +++++++++--------- .../uoc/elc/lti/tool/deeplinking/Settings.java | 5 ++--- .../DeepLinkingLaunchValidatable.java | 4 ++-- .../lti/tool/validator/LTICoreValidator.java | 8 ++++---- .../LTIResourceLinkLaunchValidatable.java | 3 ++- .../AccessTokenRequestHandlerTest.java | 15 +++++++-------- .../uoc/elc/lti/platform/ags/ScoreTest.java | 9 +++++---- .../deeplinking/DeepLinkingClientTest.java | 17 +++++++++-------- .../deeplinking/FileItemValidatorTest.java | 7 ++++--- .../deeplinking/ItemValidatorTest.java | 13 +++++++------ .../deeplinking/LinkItemValidatorTest.java | 13 +++++++------ .../LtiResourceItemValidatorTest.java | 11 ++++++----- .../platform/deeplinking/content/ItemTest.java | 10 ++++++---- .../deeplinking/content/LinkItemTest.java | 7 ++++--- .../content/LtiResourceItemTest.java | 10 ++++++---- .../java/edu/uoc/elc/lti/tool/ToolTest.java | 17 +++++++++-------- .../elc/lti/tool/deeplinking/SettingsTest.java | 6 +++--- .../edu/uoc/lti/jwt/claims/TestLaunch.java | 6 +++--- .../uoc/lti/jwt/claims/TestLaunchLoader.java | 4 ++-- .../edu/uoc/lti/jwt/claims/TokenBuilder.java | 10 +++++----- 36 files changed, 145 insertions(+), 139 deletions(-) diff --git a/src/main/java/edu/uoc/elc/lti/platform/Member.java b/src/main/java/edu/uoc/elc/lti/platform/Member.java index c52c3b8..deae643 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/Member.java +++ b/src/main/java/edu/uoc/elc/lti/platform/Member.java @@ -1,12 +1,13 @@ package edu.uoc.elc.lti.platform; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; + import lombok.Getter; import lombok.Setter; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java b/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java index b4d2ead..dc2135a 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java +++ b/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java @@ -1,10 +1,10 @@ package edu.uoc.elc.lti.platform; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/PlatformClient.java b/src/main/java/edu/uoc/elc/lti/platform/PlatformClient.java index 3c0f2da..58fe827 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/PlatformClient.java +++ b/src/main/java/edu/uoc/elc/lti/platform/PlatformClient.java @@ -1,14 +1,15 @@ package edu.uoc.elc.lti.platform; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.io.IOUtils; - import java.io.IOException; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; +import org.apache.commons.io.IOUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandler.java b/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandler.java index 3f00c6b..326a016 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandler.java +++ b/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandler.java @@ -1,5 +1,11 @@ package edu.uoc.elc.lti.platform.accesstoken; +import java.io.IOException; +import java.net.URL; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import edu.uoc.elc.lti.platform.PlatformClient; import edu.uoc.elc.lti.tool.ScopeEnum; import edu.uoc.elc.lti.tool.ToolDefinition; @@ -9,12 +15,6 @@ import edu.uoc.lti.clientcredentials.ClientCredentialsTokenBuilder; import lombok.RequiredArgsConstructor; -import java.io.IOException; -import java.net.URL; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenResponse.java b/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenResponse.java index cfe5227..cd3f9b0 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenResponse.java +++ b/src/main/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenResponse.java @@ -1,6 +1,7 @@ package edu.uoc.elc.lti.platform.accesstoken; import com.fasterxml.jackson.annotation.JsonProperty; + import lombok.Getter; /** diff --git a/src/main/java/edu/uoc/elc/lti/platform/ags/AgsClientFactory.java b/src/main/java/edu/uoc/elc/lti/platform/ags/AgsClientFactory.java index 3e4f5e3..8c4154e 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/ags/AgsClientFactory.java +++ b/src/main/java/edu/uoc/elc/lti/platform/ags/AgsClientFactory.java @@ -1,5 +1,8 @@ package edu.uoc.elc.lti.platform.ags; +import java.net.URI; +import java.net.URISyntaxException; + import edu.uoc.elc.lti.exception.UnauthorizedAgsCallException; import edu.uoc.elc.lti.platform.ags.empty.EmptyResultServiceClient; import edu.uoc.elc.lti.platform.ags.empty.EmptyScoreServiceClient; @@ -11,9 +14,6 @@ import edu.uoc.lti.ags.ScoreServiceClient; import lombok.RequiredArgsConstructor; -import java.net.URI; -import java.net.URISyntaxException; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/ags/GenericResultServiceClient.java b/src/main/java/edu/uoc/elc/lti/platform/ags/GenericResultServiceClient.java index 0d1cdbe..69c1ba1 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/ags/GenericResultServiceClient.java +++ b/src/main/java/edu/uoc/elc/lti/platform/ags/GenericResultServiceClient.java @@ -1,12 +1,12 @@ package edu.uoc.elc.lti.platform.ags; +import java.util.List; + import edu.uoc.elc.lti.exception.UnauthorizedAgsCallException; import edu.uoc.lti.ags.Result; import edu.uoc.lti.ags.ResultServiceClient; import lombok.RequiredArgsConstructor; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/ags/ToolLineItemServiceClient.java b/src/main/java/edu/uoc/elc/lti/platform/ags/ToolLineItemServiceClient.java index d3d3a4e..5457242 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/ags/ToolLineItemServiceClient.java +++ b/src/main/java/edu/uoc/elc/lti/platform/ags/ToolLineItemServiceClient.java @@ -1,13 +1,13 @@ package edu.uoc.elc.lti.platform.ags; +import java.net.URI; +import java.util.List; + import edu.uoc.elc.lti.exception.UnauthorizedAgsCallException; import edu.uoc.lti.ags.LineItem; import edu.uoc.lti.ags.LineItemServiceClient; import lombok.RequiredArgsConstructor; -import java.net.URI; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClient.java b/src/main/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClient.java index abc5b26..91235df 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClient.java +++ b/src/main/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClient.java @@ -1,5 +1,10 @@ package edu.uoc.elc.lti.platform.deeplinking; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + import edu.uoc.elc.lti.exception.InvalidLTICallException; import edu.uoc.elc.lti.tool.deeplinking.Settings; import edu.uoc.lti.deeplink.DeepLinkingResponse; @@ -8,11 +13,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidator.java b/src/main/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidator.java index a57e50d..b03f65c 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidator.java +++ b/src/main/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidator.java @@ -1,11 +1,11 @@ package edu.uoc.elc.lti.platform.deeplinking; +import java.util.List; + import edu.uoc.elc.lti.tool.deeplinking.Settings; import edu.uoc.lti.deeplink.content.FileItem; import edu.uoc.lti.deeplink.content.Item; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidator.java b/src/main/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidator.java index 47fe82f..f7d6d39 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidator.java +++ b/src/main/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidator.java @@ -1,12 +1,12 @@ package edu.uoc.elc.lti.platform.deeplinking; +import java.util.List; + import edu.uoc.elc.lti.tool.deeplinking.Settings; import edu.uoc.lti.deeplink.content.Item; import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java b/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java index c67ebff..769fca3 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java +++ b/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java @@ -1,10 +1,10 @@ package edu.uoc.elc.lti.tool; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/AuthenticationResponseValidator.java b/src/main/java/edu/uoc/elc/lti/tool/AuthenticationResponseValidator.java index 3115866..85f9cb4 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/AuthenticationResponseValidator.java +++ b/src/main/java/edu/uoc/elc/lti/tool/AuthenticationResponseValidator.java @@ -1,15 +1,14 @@ package edu.uoc.elc.lti.tool; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + import edu.uoc.lti.claims.ClaimAccessor; import edu.uoc.lti.claims.ClaimsEnum; -import edu.uoc.lti.oidc.OIDCLaunchSession; import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.Arrays; -import java.util.Date; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/Context.java b/src/main/java/edu/uoc/elc/lti/tool/Context.java index f5a8b33..08173bc 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/Context.java +++ b/src/main/java/edu/uoc/elc/lti/tool/Context.java @@ -1,10 +1,10 @@ package edu.uoc.elc.lti.tool; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/LaunchValidator.java b/src/main/java/edu/uoc/elc/lti/tool/LaunchValidator.java index b187e2f..999bbc4 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/LaunchValidator.java +++ b/src/main/java/edu/uoc/elc/lti/tool/LaunchValidator.java @@ -2,19 +2,12 @@ import edu.uoc.elc.lti.tool.validator.LaunchValidatable; import edu.uoc.elc.lti.tool.validator.MessageTypesValidatorEnum; -import edu.uoc.lti.MessageTypesEnum; import edu.uoc.lti.claims.ClaimAccessor; import edu.uoc.lti.claims.ClaimsEnum; -import edu.uoc.lti.deeplink.content.DocumentTargetEnum; -import edu.uoc.lti.deeplink.content.Presentation; import edu.uoc.lti.oidc.OIDCLaunchSession; import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java b/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java index f086cf8..b209fac 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java +++ b/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java @@ -1,10 +1,10 @@ package edu.uoc.elc.lti.tool; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/Tool.java b/src/main/java/edu/uoc/elc/lti/tool/Tool.java index 67b7644..8ef0240 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/Tool.java +++ b/src/main/java/edu/uoc/elc/lti/tool/Tool.java @@ -1,5 +1,14 @@ package edu.uoc.elc.lti.tool; +import java.io.IOException; +import java.math.BigInteger; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.SecureRandom; +import java.util.Date; +import java.util.List; +import java.util.Map; + import edu.uoc.elc.lti.exception.BadToolProviderConfigurationException; import edu.uoc.elc.lti.platform.accesstoken.AccessTokenRequestHandler; import edu.uoc.elc.lti.platform.accesstoken.AccessTokenResponse; @@ -16,15 +25,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.io.IOException; -import java.math.BigInteger; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.SecureRandom; -import java.util.Date; -import java.util.List; -import java.util.Map; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java b/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java index a1e6acf..6e2f68f 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java +++ b/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java @@ -1,11 +1,10 @@ package edu.uoc.elc.lti.tool.deeplinking; +import java.util.List; + import lombok.Getter; import lombok.Setter; -import java.util.Arrays; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/validator/DeepLinkingLaunchValidatable.java b/src/main/java/edu/uoc/elc/lti/tool/validator/DeepLinkingLaunchValidatable.java index 1d0a90f..becc1b1 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/validator/DeepLinkingLaunchValidatable.java +++ b/src/main/java/edu/uoc/elc/lti/tool/validator/DeepLinkingLaunchValidatable.java @@ -1,5 +1,7 @@ package edu.uoc.elc.lti.tool.validator; +import java.util.List; + import edu.uoc.elc.lti.tool.ToolDefinition; import edu.uoc.elc.lti.tool.deeplinking.Settings; import edu.uoc.lti.MessageTypesEnum; @@ -7,8 +9,6 @@ import edu.uoc.lti.claims.ClaimsEnum; import edu.uoc.lti.oidc.OIDCLaunchSession; -import java.util.List; - /** * @author xaracil@uoc.edu */ diff --git a/src/main/java/edu/uoc/elc/lti/tool/validator/LTICoreValidator.java b/src/main/java/edu/uoc/elc/lti/tool/validator/LTICoreValidator.java index 26b7b53..5c890f5 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/validator/LTICoreValidator.java +++ b/src/main/java/edu/uoc/elc/lti/tool/validator/LTICoreValidator.java @@ -1,5 +1,9 @@ package edu.uoc.elc.lti.tool.validator; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import edu.uoc.elc.lti.tool.Context; import edu.uoc.elc.lti.tool.Platform; import edu.uoc.elc.lti.tool.RolesEnum; @@ -12,10 +16,6 @@ import edu.uoc.lti.oidc.OIDCLaunchSession; import lombok.Getter; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - /** * Core validator, validades only core requirements (common to all launches) * Intented to expand by subclasses diff --git a/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java b/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java index 30489fa..a0945bc 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java +++ b/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java @@ -1,6 +1,7 @@ package edu.uoc.elc.lti.tool.validator; -import edu.uoc.elc.lti.tool.*; +import edu.uoc.elc.lti.tool.ResourceLink; +import edu.uoc.elc.lti.tool.ToolDefinition; import edu.uoc.lti.MessageTypesEnum; import edu.uoc.lti.claims.ClaimAccessor; import edu.uoc.lti.claims.ClaimsEnum; diff --git a/src/test/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandlerTest.java b/src/test/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandlerTest.java index 3f92688..cfbeddb 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandlerTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/accesstoken/AccessTokenRequestHandlerTest.java @@ -1,18 +1,17 @@ package edu.uoc.elc.lti.platform.accesstoken; -import edu.uoc.elc.lti.platform.accesstoken.AccessTokenResponse; -import edu.uoc.elc.lti.platform.accesstoken.AccessTokenRequestHandler; -import edu.uoc.elc.lti.tool.ToolDefinition; +import java.io.IOException; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + import edu.uoc.elc.lti.exception.BadToolProviderConfigurationException; +import edu.uoc.elc.lti.tool.ToolDefinition; import edu.uoc.lti.accesstoken.AccessTokenRequestBuilder; import edu.uoc.lti.accesstoken.JSONAccessTokenRequestBuilderImpl; import edu.uoc.lti.clientcredentials.ClientCredentialsTokenBuilder; import edu.uoc.lti.jwt.client.JWSClientCredentialsTokenBuilder; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/ags/ScoreTest.java b/src/test/java/edu/uoc/elc/lti/platform/ags/ScoreTest.java index d4e64f8..4bf5dff 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/ags/ScoreTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/ags/ScoreTest.java @@ -1,12 +1,13 @@ package edu.uoc.elc.lti.platform.ags; -import edu.uoc.lti.ags.ActivityProgressEnum; -import edu.uoc.lti.ags.GradingProgressEnum; -import edu.uoc.lti.ags.Score; +import java.time.Instant; + import org.junit.Assert; import org.junit.Test; -import java.time.Instant; +import edu.uoc.lti.ags.ActivityProgressEnum; +import edu.uoc.lti.ags.GradingProgressEnum; +import edu.uoc.lti.ags.Score; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClientTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClientTest.java index b433410..3545b7e 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClientTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/DeepLinkingClientTest.java @@ -1,5 +1,14 @@ package edu.uoc.elc.lti.platform.deeplinking; +import java.io.IOException; +import java.net.URL; +import java.util.Arrays; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + import edu.uoc.elc.lti.exception.InvalidLTICallException; import edu.uoc.elc.lti.tool.deeplinking.Settings; import edu.uoc.lti.deeplink.DeepLinkingTokenBuilder; @@ -8,14 +17,6 @@ import edu.uoc.lti.deeplink.content.LinkItem; import edu.uoc.lti.deeplink.content.LtiResourceItem; import edu.uoc.lti.jwt.deeplink.JWSTokenBuilder; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import java.io.IOException; -import java.net.URL; -import java.util.Arrays; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidatorTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidatorTest.java index 1619e36..a24e037 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidatorTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/FileItemValidatorTest.java @@ -1,13 +1,14 @@ package edu.uoc.elc.lti.platform.deeplinking; -import edu.uoc.elc.lti.tool.deeplinking.Settings; -import edu.uoc.lti.deeplink.content.FileItem; +import java.util.Arrays; + import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import java.util.Arrays; +import edu.uoc.elc.lti.tool.deeplinking.Settings; +import edu.uoc.lti.deeplink.content.FileItem; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidatorTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidatorTest.java index 66a537b..92c7930 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidatorTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/ItemValidatorTest.java @@ -1,16 +1,17 @@ package edu.uoc.elc.lti.platform.deeplinking; -import edu.uoc.elc.lti.tool.deeplinking.Settings; -import edu.uoc.lti.deeplink.content.FileItem; -import edu.uoc.lti.deeplink.content.Item; -import edu.uoc.lti.deeplink.content.LinkItem; -import edu.uoc.lti.deeplink.content.LtiResourceItem; +import java.util.Arrays; + import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import java.util.Arrays; +import edu.uoc.elc.lti.tool.deeplinking.Settings; +import edu.uoc.lti.deeplink.content.FileItem; +import edu.uoc.lti.deeplink.content.Item; +import edu.uoc.lti.deeplink.content.LinkItem; +import edu.uoc.lti.deeplink.content.LtiResourceItem; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LinkItemValidatorTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LinkItemValidatorTest.java index b4eccce..1160cc2 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LinkItemValidatorTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LinkItemValidatorTest.java @@ -1,16 +1,17 @@ package edu.uoc.elc.lti.platform.deeplinking; -import edu.uoc.elc.lti.tool.deeplinking.Settings; -import edu.uoc.lti.deeplink.content.Embed; -import edu.uoc.lti.deeplink.content.IFrame; -import edu.uoc.lti.deeplink.content.LinkItem; -import edu.uoc.lti.deeplink.content.Window; +import java.util.Arrays; + import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import java.util.Arrays; +import edu.uoc.elc.lti.tool.deeplinking.Settings; +import edu.uoc.lti.deeplink.content.Embed; +import edu.uoc.lti.deeplink.content.IFrame; +import edu.uoc.lti.deeplink.content.LinkItem; +import edu.uoc.lti.deeplink.content.Window; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LtiResourceItemValidatorTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LtiResourceItemValidatorTest.java index 6abe453..afc504e 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LtiResourceItemValidatorTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/LtiResourceItemValidatorTest.java @@ -1,15 +1,16 @@ package edu.uoc.elc.lti.platform.deeplinking; -import edu.uoc.elc.lti.tool.deeplinking.Settings; -import edu.uoc.lti.deeplink.content.IFrame; -import edu.uoc.lti.deeplink.content.LtiResourceItem; -import edu.uoc.lti.deeplink.content.Window; +import java.util.Arrays; + import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import java.util.Arrays; +import edu.uoc.elc.lti.tool.deeplinking.Settings; +import edu.uoc.lti.deeplink.content.IFrame; +import edu.uoc.lti.deeplink.content.LtiResourceItem; +import edu.uoc.lti.deeplink.content.Window; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/ItemTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/ItemTest.java index 5a42271..e32c413 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/ItemTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/ItemTest.java @@ -1,13 +1,15 @@ package edu.uoc.elc.lti.platform.deeplinking.content; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; + import edu.uoc.lti.deeplink.content.Item; import edu.uoc.lti.deeplink.content.LinkItem; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LinkItemTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LinkItemTest.java index 9c745e3..8006c04 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LinkItemTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LinkItemTest.java @@ -1,11 +1,12 @@ package edu.uoc.elc.lti.platform.deeplinking.content; -import edu.uoc.lti.deeplink.content.LinkItem; -import org.junit.Test; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import org.junit.Test; + +import edu.uoc.lti.deeplink.content.LinkItem; + /** * @author xaracil@uoc.edu */ diff --git a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LtiResourceItemTest.java b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LtiResourceItemTest.java index 6e2380c..6980598 100644 --- a/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LtiResourceItemTest.java +++ b/src/test/java/edu/uoc/elc/lti/platform/deeplinking/content/LtiResourceItemTest.java @@ -1,12 +1,14 @@ package edu.uoc.elc.lti.platform.deeplinking.content; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import edu.uoc.lti.deeplink.content.LtiResourceItem; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import edu.uoc.lti.deeplink.content.LtiResourceItem; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/tool/ToolTest.java b/src/test/java/edu/uoc/elc/lti/tool/ToolTest.java index 57570e7..b86b976 100644 --- a/src/test/java/edu/uoc/elc/lti/tool/ToolTest.java +++ b/src/test/java/edu/uoc/elc/lti/tool/ToolTest.java @@ -1,5 +1,14 @@ package edu.uoc.elc.lti.tool; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.List; +import java.util.function.BiConsumer; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + import edu.uoc.elc.lti.tool.oidc.InMemoryOIDCLaunchSession; import edu.uoc.lti.accesstoken.JSONAccessTokenRequestBuilderImpl; import edu.uoc.lti.jwt.claims.JWSClaimAccessor; @@ -7,14 +16,6 @@ import edu.uoc.lti.jwt.claims.TestLaunchLoader; import edu.uoc.lti.jwt.claims.TokenBuilder; import edu.uoc.lti.jwt.client.JWSClientCredentialsTokenBuilder; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.net.URISyntaxException; -import java.net.URL; -import java.util.List; -import java.util.function.BiConsumer; /** * @author xaracil@uoc.edu diff --git a/src/test/java/edu/uoc/elc/lti/tool/deeplinking/SettingsTest.java b/src/test/java/edu/uoc/elc/lti/tool/deeplinking/SettingsTest.java index 1f5244d..2a42126 100644 --- a/src/test/java/edu/uoc/elc/lti/tool/deeplinking/SettingsTest.java +++ b/src/test/java/edu/uoc/elc/lti/tool/deeplinking/SettingsTest.java @@ -1,11 +1,11 @@ package edu.uoc.elc.lti.tool.deeplinking; -import org.junit.Assert; -import org.junit.Test; - import java.util.Arrays; import java.util.List; +import org.junit.Assert; +import org.junit.Test; + /** * @author xaracil@uoc.edu */ diff --git a/src/test/java/edu/uoc/lti/jwt/claims/TestLaunch.java b/src/test/java/edu/uoc/lti/jwt/claims/TestLaunch.java index ab87c35..4bc010e 100644 --- a/src/test/java/edu/uoc/lti/jwt/claims/TestLaunch.java +++ b/src/test/java/edu/uoc/lti/jwt/claims/TestLaunch.java @@ -1,11 +1,11 @@ package edu.uoc.lti.jwt.claims; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - import java.util.List; import java.util.Map; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + /** * @author xaracil@uoc.edu */ diff --git a/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java b/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java index 8680be2..e72b7ad 100644 --- a/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java +++ b/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java @@ -1,7 +1,5 @@ package edu.uoc.lti.jwt.claims; -import com.fasterxml.jackson.databind.ObjectMapper; - import java.io.File; import java.io.IOException; import java.net.URI; @@ -9,6 +7,8 @@ import java.util.List; import java.util.Map; +import com.fasterxml.jackson.databind.ObjectMapper; + /** * @author xaracil@uoc.edu */ diff --git a/src/test/java/edu/uoc/lti/jwt/claims/TokenBuilder.java b/src/test/java/edu/uoc/lti/jwt/claims/TokenBuilder.java index 2efe11d..4b24d62 100644 --- a/src/test/java/edu/uoc/lti/jwt/claims/TokenBuilder.java +++ b/src/test/java/edu/uoc/lti/jwt/claims/TokenBuilder.java @@ -1,16 +1,16 @@ package edu.uoc.lti.jwt.claims; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + import edu.uoc.lti.claims.ClaimsEnum; import edu.uoc.lti.jwt.AlgorithmFactory; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import lombok.RequiredArgsConstructor; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; - /** * @author xaracil@uoc.edu */ From 1de2931f3fcedfec9979cb957200562cc636e3de Mon Sep 17 00:00:00 2001 From: heutelbeck Date: Wed, 26 Feb 2020 14:47:16 +0100 Subject: [PATCH 4/7] fix compatibility issue with Moodle 3.8 --- .../java/edu/uoc/elc/lti/tool/Platform.java | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/main/java/edu/uoc/elc/lti/tool/Platform.java b/src/main/java/edu/uoc/elc/lti/tool/Platform.java index 3211719..6ab07ff 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/Platform.java +++ b/src/main/java/edu/uoc/elc/lti/tool/Platform.java @@ -1,19 +1,30 @@ -package edu.uoc.elc.lti.tool; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -public class Platform { - private String guid; - private String name; - private String contact_email; - private String description; - private String url; - private String product_family_code; - private String version; -} +package edu.uoc.elc.lti.tool; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author xaracil@uoc.edu + */ +@Getter +@Setter +/* + * To fix an issue with Moodle 3.8 not compliant with LTI. While LTI 1.3 + * specifies the key to be "product_family_code", Moodle 3.8 uses + * "familiy_code". The @JsonIgnoreProperties annotation ignores the bad key for + * now without remapping it to the original spec. + * + * @author heutelbeck + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Platform { + private String guid; + private String name; + private String contact_email; + private String description; + private String url; + private String product_family_code; + private String version; +} From 1fed6d94023c918343ae7b3ef0d68f1a60abe033 Mon Sep 17 00:00:00 2001 From: heutelbeck Date: Wed, 26 Feb 2020 20:30:14 +0100 Subject: [PATCH 5/7] cleanup usage of Lombok and Exception handling --- .../platform/NamesRoleServiceResponse.java | 34 +- .../elc/lti/tool/AssignmentGradeService.java | 64 ++- .../java/edu/uoc/elc/lti/tool/Context.java | 36 +- .../uoc/elc/lti/tool/NamesRoleService.java | 30 +- .../java/edu/uoc/elc/lti/tool/Platform.java | 6 +- .../edu/uoc/elc/lti/tool/ResourceLink.java | 28 +- src/main/java/edu/uoc/elc/lti/tool/Tool.java | 454 +++++++++--------- .../edu/uoc/elc/lti/tool/ToolBuilders.java | 34 +- .../edu/uoc/elc/lti/tool/ToolDefinition.java | 42 +- src/main/java/edu/uoc/elc/lti/tool/User.java | 40 +- .../elc/lti/tool/deeplinking/Settings.java | 44 +- .../LTIResourceLinkLaunchValidatable.java | 240 ++++----- .../uoc/lti/jwt/claims/TestLaunchLoader.java | 112 ++--- 13 files changed, 573 insertions(+), 591 deletions(-) diff --git a/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java b/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java index dc2135a..0ae271d 100644 --- a/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java +++ b/src/main/java/edu/uoc/elc/lti/platform/NamesRoleServiceResponse.java @@ -1,16 +1,18 @@ -package edu.uoc.elc.lti.platform; - -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -public class NamesRoleServiceResponse { - private String id; - private List members; -} +package edu.uoc.elc.lti.platform; + +import java.util.List; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * @author xaracil@uoc.edu + */ +@Getter +@Setter +@ToString +public class NamesRoleServiceResponse { + private String id; + private List members; +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java b/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java index 769fca3..84521d7 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java +++ b/src/main/java/edu/uoc/elc/lti/tool/AssignmentGradeService.java @@ -1,33 +1,31 @@ -package edu.uoc.elc.lti.tool; - -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -public class AssignmentGradeService { - private List scope; - private String lineitems; - private String lineitem; - - public boolean canReadResults() { - return scope != null && scope.contains(ScopeEnum.AGS_SCOPE_RESULT.getScope()); - } - - public boolean canReadLineItems() { - return canManageLineItems() || (scope != null && scope.contains(ScopeEnum.AGS_SCOPE_LINE_ITEM_READONLY.getScope())); - } - - public boolean canManageLineItems() { - return scope != null && scope.contains(ScopeEnum.AGS_SCOPE_LINE_ITEM.getScope()); - } - - public boolean canScore() { - return scope != null && scope.contains(ScopeEnum.AGS_SCOPE_SCORE.getScope()); - } -} +package edu.uoc.elc.lti.tool; + +import java.util.List; + +import lombok.Data; + +/** + * @author xaracil@uoc.edu + */ +@Data +public class AssignmentGradeService { + private List scope; + private String lineitems; + private String lineitem; + + public boolean canReadResults() { + return scope != null && scope.contains(ScopeEnum.AGS_SCOPE_RESULT.getScope()); + } + + public boolean canReadLineItems() { + return canManageLineItems() || (scope != null && scope.contains(ScopeEnum.AGS_SCOPE_LINE_ITEM_READONLY.getScope())); + } + + public boolean canManageLineItems() { + return scope != null && scope.contains(ScopeEnum.AGS_SCOPE_LINE_ITEM.getScope()); + } + + public boolean canScore() { + return scope != null && scope.contains(ScopeEnum.AGS_SCOPE_SCORE.getScope()); + } +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/Context.java b/src/main/java/edu/uoc/elc/lti/tool/Context.java index 08173bc..579f6de 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/Context.java +++ b/src/main/java/edu/uoc/elc/lti/tool/Context.java @@ -1,19 +1,17 @@ -package edu.uoc.elc.lti.tool; - -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -public class Context { - private String id; - private String label; - private String title; - private List type; - -} +package edu.uoc.elc.lti.tool; + +import java.util.List; + +import lombok.Data; + +/** + * @author xaracil@uoc.edu + */ +@Data +public class Context { + private String id; + private String label; + private String title; + private List type; + +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java b/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java index b209fac..4699965 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java +++ b/src/main/java/edu/uoc/elc/lti/tool/NamesRoleService.java @@ -1,16 +1,14 @@ -package edu.uoc.elc.lti.tool; - -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -public class NamesRoleService { - private String context_memberships_url; - private List service_versions; -} +package edu.uoc.elc.lti.tool; + +import java.util.List; + +import lombok.Data; + +/** + * @author xaracil@uoc.edu + */ +@Data +public class NamesRoleService { + private String context_memberships_url; + private List service_versions; +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/Platform.java b/src/main/java/edu/uoc/elc/lti/tool/Platform.java index 6ab07ff..d1eb154 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/Platform.java +++ b/src/main/java/edu/uoc/elc/lti/tool/Platform.java @@ -2,14 +2,12 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; /** * @author xaracil@uoc.edu */ -@Getter -@Setter +@Data /* * To fix an issue with Moodle 3.8 not compliant with LTI. While LTI 1.3 * specifies the key to be "product_family_code", Moodle 3.8 uses diff --git a/src/main/java/edu/uoc/elc/lti/tool/ResourceLink.java b/src/main/java/edu/uoc/elc/lti/tool/ResourceLink.java index 7e18d08..79db71d 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/ResourceLink.java +++ b/src/main/java/edu/uoc/elc/lti/tool/ResourceLink.java @@ -1,15 +1,13 @@ -package edu.uoc.elc.lti.tool; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -public class ResourceLink { - private String id; - private String title; - private String description; -} +package edu.uoc.elc.lti.tool; + +import lombok.Data; + +/** + * @author xaracil@uoc.edu + */ +@Data +public class ResourceLink { + private String id; + private String title; + private String description; +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/Tool.java b/src/main/java/edu/uoc/elc/lti/tool/Tool.java index 8ef0240..d8d21c4 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/Tool.java +++ b/src/main/java/edu/uoc/elc/lti/tool/Tool.java @@ -1,234 +1,220 @@ -package edu.uoc.elc.lti.tool; - -import java.io.IOException; -import java.math.BigInteger; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.SecureRandom; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import edu.uoc.elc.lti.exception.BadToolProviderConfigurationException; -import edu.uoc.elc.lti.platform.accesstoken.AccessTokenRequestHandler; -import edu.uoc.elc.lti.platform.accesstoken.AccessTokenResponse; -import edu.uoc.elc.lti.platform.ags.AgsClientFactory; -import edu.uoc.elc.lti.platform.deeplinking.DeepLinkingClient; -import edu.uoc.elc.lti.tool.deeplinking.Settings; -import edu.uoc.elc.lti.tool.oidc.AuthRequestUrlBuilder; -import edu.uoc.elc.lti.tool.oidc.LoginRequest; -import edu.uoc.elc.lti.tool.oidc.LoginResponse; -import edu.uoc.lti.MessageTypesEnum; -import edu.uoc.lti.claims.ClaimAccessor; -import edu.uoc.lti.claims.ClaimsEnum; -import edu.uoc.lti.oidc.OIDCLaunchSession; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * @author xaracil@uoc.edu - */ -@RequiredArgsConstructor -public class Tool { - @Getter - String issuer; - @Getter - String audience; - - @Getter - String kid; - - @Getter - Date issuedAt; - - @Getter - Date expiresAt; - - @Getter - private User user; - - @Getter - private String locale; - - @Getter - private boolean valid; - - @Getter - private String reason; - - private AccessTokenResponse accessTokenResponse; - - private final ToolDefinition toolDefinition; - private final ClaimAccessor claimAccessor; - private final OIDCLaunchSession oidcLaunchSession; - private final ToolBuilders toolBuilders; - - public boolean validate(String token, String state) { - LaunchValidator launchValidator = new LaunchValidator(toolDefinition, claimAccessor, oidcLaunchSession); - this.valid = launchValidator.validate(token, state); - if (!this.valid) { - this.reason = launchValidator.getReason(); - return false; - } - - // get the standard JWT payload claims - this.issuer = this.claimAccessor.getIssuer(); - this.audience = this.claimAccessor.getAudience(); - this.issuedAt = this.claimAccessor.getIssuedAt(); - this.expiresAt = this.claimAccessor.getExpiration(); - - // create the user attribute - createUser(this.claimAccessor.getSubject()); - - // update locale attribute - this.locale = this.claimAccessor.get(ClaimsEnum.LOCALE); - - return this.valid; - } - - public AccessTokenResponse getAccessToken() throws IOException, BadToolProviderConfigurationException { - if (!this.isValid()) { - return null; - } - - if (accessTokenResponse == null) { - AccessTokenRequestHandler accessTokenRequestHandler = new AccessTokenRequestHandler(kid, - toolDefinition, - toolBuilders.getClientCredentialsTokenBuilder(), - toolBuilders.getAccessTokenRequestBuilder()); - accessTokenResponse = accessTokenRequestHandler.getAccessToken(); - } - - return accessTokenResponse; - } - - private void createUser(String subject) { - this.user = User.builder() - .id(subject) - .givenName(this.claimAccessor.get(ClaimsEnum.GIVEN_NAME)) - .familyName(this.claimAccessor.get(ClaimsEnum.FAMILY_NAME)) - .middleName(this.claimAccessor.get(ClaimsEnum.MIDDLE_NAME)) - .picture(this.claimAccessor.get(ClaimsEnum.PICTURE)) - .email(this.claimAccessor.get(ClaimsEnum.EMAIL)) - .name(this.claimAccessor.get(ClaimsEnum.NAME)) - .build(); - } - - - // general claims getters - public Platform getPlatform() { - return this.claimAccessor.get(ClaimsEnum.TOOL_PLATFORM, Platform.class); - } - - public Context getContext() { - return this.claimAccessor.get(ClaimsEnum.CONTEXT, Context.class); - } - - public ResourceLink getResourceLink() { - return this.claimAccessor.get(ClaimsEnum.RESOURCE_LINK, ResourceLink.class); - } - - public NamesRoleService getNameRoleService() { - return this.claimAccessor.get(ClaimsEnum.NAMES_ROLE_SERVICE, NamesRoleService.class); - } - - public AssignmentGradeService getAssignmentGradeService() { - return this.claimAccessor.get(ClaimsEnum.ASSIGNMENT_GRADE_SERVICE, AssignmentGradeService.class); - } - - public String getDeploymentId() { - if (!isDeepLinkingRequest()) { - return null; - } - return this.claimAccessor.get(ClaimsEnum.DEPLOYMENT_ID); - } - - public Settings getDeepLinkingSettings() { - if (!isDeepLinkingRequest()) { - return null; - } - return this.claimAccessor.get(ClaimsEnum.DEEP_LINKING_SETTINGS, Settings.class); - } - - - public List getRoles() { - Class> rolesClass = (Class) List.class; - return this.claimAccessor.get(ClaimsEnum.ROLES, rolesClass); - } - - public String getCustomParameter(String name) { - Class> customClass = (Class) Map.class; - final Map claim = this.claimAccessor.get(ClaimsEnum.CUSTOM, customClass); - if (claim != null) { - return claim.get(name); - } - return null; - } - - public MessageTypesEnum getMessageType() { - try { - return MessageTypesEnum.valueOf(this.claimAccessor.get(ClaimsEnum.MESSAGE_TYPE)); - } catch (IllegalArgumentException ignored) { - return null; - } - } - - public boolean isDeepLinkingRequest() { - return MessageTypesEnum.LtiDeepLinkingRequest == getMessageType(); - } - - public boolean isResourceLinkLaunch() { - return MessageTypesEnum.LtiResourceLinkRequest == getMessageType(); - } - - public DeepLinkingClient getDeepLinkingClient() { - if (!isDeepLinkingRequest()) { - return null; - } - - return new DeepLinkingClient( - toolBuilders.getDeepLinkingTokenBuilder(), - getIssuer(), - toolDefinition.getClientId(), - this.claimAccessor.getAzp(), - getDeploymentId(), - this.claimAccessor.get(ClaimsEnum.NONCE), - getDeepLinkingSettings()); - } - - public AgsClientFactory getAssignmentGradeServiceClientFactory() { - return new AgsClientFactory(getAssignmentGradeService(), - getResourceLink()); - } - - // roles commodity methods - public boolean isLearner() { - return getRoles() != null && getRoles().contains(RolesEnum.LEARNER.getName()); - } - - public boolean isInstructor() { - return getRoles() != null && getRoles().contains(RolesEnum.INSTRUCTOR.getName()); - } - - // openid methods - public String getOidcAuthUrl(LoginRequest loginRequest) throws URISyntaxException { - final LoginResponse loginResponse = LoginResponse.builder() - .client_id(loginRequest.getClient_id() != null ? loginRequest.getClient_id() : toolDefinition.getClientId()) - .redirect_uri(loginRequest.getTarget_link_uri()) - .login_hint(loginRequest.getLogin_hint()) - .state(new BigInteger(50, new SecureRandom()).toString(16)) - .nonce(new BigInteger(50, new SecureRandom()).toString(16)) - .lti_message_hint(loginRequest.getLti_message_hint()) - .build(); - - final URI uri = new URI(loginRequest.getTarget_link_uri()); - - // save in session - this.oidcLaunchSession.setState(loginResponse.getState()); - this.oidcLaunchSession.setNonce(loginResponse.getNonce()); - this.oidcLaunchSession.setTargetLinkUri(loginResponse.getRedirect_uri()); - - // return url - return AuthRequestUrlBuilder.build(toolDefinition.getOidcAuthUrl(), loginResponse); - } -} +package edu.uoc.elc.lti.tool; + +import java.io.IOException; +import java.math.BigInteger; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.SecureRandom; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import edu.uoc.elc.lti.exception.BadToolProviderConfigurationException; +import edu.uoc.elc.lti.platform.accesstoken.AccessTokenRequestHandler; +import edu.uoc.elc.lti.platform.accesstoken.AccessTokenResponse; +import edu.uoc.elc.lti.platform.ags.AgsClientFactory; +import edu.uoc.elc.lti.platform.deeplinking.DeepLinkingClient; +import edu.uoc.elc.lti.tool.deeplinking.Settings; +import edu.uoc.elc.lti.tool.oidc.AuthRequestUrlBuilder; +import edu.uoc.elc.lti.tool.oidc.LoginRequest; +import edu.uoc.elc.lti.tool.oidc.LoginResponse; +import edu.uoc.lti.MessageTypesEnum; +import edu.uoc.lti.claims.ClaimAccessor; +import edu.uoc.lti.claims.ClaimsEnum; +import edu.uoc.lti.oidc.OIDCLaunchSession; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @author xaracil@uoc.edu + */ +@RequiredArgsConstructor +public class Tool { + @Getter + private String issuer; + + @Getter + private String audience; + + @Getter + private String kid; + + @Getter + private Date issuedAt; + + @Getter + private Date expiresAt; + + @Getter + private User user; + + @Getter + private String locale; + + @Getter + private boolean valid; + + @Getter + private String reason; + + private AccessTokenResponse accessTokenResponse; + + private final ToolDefinition toolDefinition; + private final ClaimAccessor claimAccessor; + private final OIDCLaunchSession oidcLaunchSession; + private final ToolBuilders toolBuilders; + + public boolean validate(String token, String state) { + LaunchValidator launchValidator = new LaunchValidator(toolDefinition, claimAccessor, oidcLaunchSession); + this.valid = launchValidator.validate(token, state); + if (!this.valid) { + this.reason = launchValidator.getReason(); + return false; + } + + // get the standard JWT payload claims + this.issuer = this.claimAccessor.getIssuer(); + this.audience = this.claimAccessor.getAudience(); + this.issuedAt = this.claimAccessor.getIssuedAt(); + this.expiresAt = this.claimAccessor.getExpiration(); + + // create the user attribute + createUser(this.claimAccessor.getSubject()); + + // update locale attribute + this.locale = this.claimAccessor.get(ClaimsEnum.LOCALE); + + return this.valid; + } + + public AccessTokenResponse getAccessToken() throws IOException, BadToolProviderConfigurationException { + if (!this.isValid()) { + return null; + } + + if (accessTokenResponse == null) { + AccessTokenRequestHandler accessTokenRequestHandler = new AccessTokenRequestHandler(kid, toolDefinition, + toolBuilders.getClientCredentialsTokenBuilder(), toolBuilders.getAccessTokenRequestBuilder()); + accessTokenResponse = accessTokenRequestHandler.getAccessToken(); + } + + return accessTokenResponse; + } + + private void createUser(String subject) { + this.user = User.builder().id(subject).givenName(this.claimAccessor.get(ClaimsEnum.GIVEN_NAME)) + .familyName(this.claimAccessor.get(ClaimsEnum.FAMILY_NAME)) + .middleName(this.claimAccessor.get(ClaimsEnum.MIDDLE_NAME)) + .picture(this.claimAccessor.get(ClaimsEnum.PICTURE)).email(this.claimAccessor.get(ClaimsEnum.EMAIL)) + .name(this.claimAccessor.get(ClaimsEnum.NAME)).build(); + } + + // general claims getters + public Platform getPlatform() { + return this.claimAccessor.get(ClaimsEnum.TOOL_PLATFORM, Platform.class); + } + + public Context getContext() { + return this.claimAccessor.get(ClaimsEnum.CONTEXT, Context.class); + } + + public ResourceLink getResourceLink() { + return this.claimAccessor.get(ClaimsEnum.RESOURCE_LINK, ResourceLink.class); + } + + public NamesRoleService getNameRoleService() { + return this.claimAccessor.get(ClaimsEnum.NAMES_ROLE_SERVICE, NamesRoleService.class); + } + + public AssignmentGradeService getAssignmentGradeService() { + return this.claimAccessor.get(ClaimsEnum.ASSIGNMENT_GRADE_SERVICE, AssignmentGradeService.class); + } + + public String getDeploymentId() { + if (!isDeepLinkingRequest()) { + return null; + } + return this.claimAccessor.get(ClaimsEnum.DEPLOYMENT_ID); + } + + public Settings getDeepLinkingSettings() { + if (!isDeepLinkingRequest()) { + return null; + } + return this.claimAccessor.get(ClaimsEnum.DEEP_LINKING_SETTINGS, Settings.class); + } + + public List getRoles() { + Class> rolesClass = (Class) List.class; + return this.claimAccessor.get(ClaimsEnum.ROLES, rolesClass); + } + + public String getCustomParameter(String name) { + Class> customClass = (Class) Map.class; + final Map claim = this.claimAccessor.get(ClaimsEnum.CUSTOM, customClass); + if (claim != null) { + return claim.get(name); + } + return null; + } + + public MessageTypesEnum getMessageType() { + try { + return MessageTypesEnum.valueOf(this.claimAccessor.get(ClaimsEnum.MESSAGE_TYPE)); + } catch (IllegalArgumentException ignored) { + return null; + } + } + + public boolean isDeepLinkingRequest() { + return MessageTypesEnum.LtiDeepLinkingRequest == getMessageType(); + } + + public boolean isResourceLinkLaunch() { + return MessageTypesEnum.LtiResourceLinkRequest == getMessageType(); + } + + public DeepLinkingClient getDeepLinkingClient() { + if (!isDeepLinkingRequest()) { + return null; + } + + return new DeepLinkingClient(toolBuilders.getDeepLinkingTokenBuilder(), getIssuer(), + toolDefinition.getClientId(), this.claimAccessor.getAzp(), getDeploymentId(), + this.claimAccessor.get(ClaimsEnum.NONCE), getDeepLinkingSettings()); + } + + public AgsClientFactory getAssignmentGradeServiceClientFactory() { + return new AgsClientFactory(getAssignmentGradeService(), getResourceLink()); + } + + // roles commodity methods + public boolean isLearner() { + return getRoles() != null && getRoles().contains(RolesEnum.LEARNER.getName()); + } + + public boolean isInstructor() { + return getRoles() != null && getRoles().contains(RolesEnum.INSTRUCTOR.getName()); + } + + // openid methods + public String getOidcAuthUrl(LoginRequest loginRequest) throws URISyntaxException { + final LoginResponse loginResponse = LoginResponse.builder() + .client_id(loginRequest.getClient_id() != null ? loginRequest.getClient_id() + : toolDefinition.getClientId()) + .redirect_uri(loginRequest.getTarget_link_uri()).login_hint(loginRequest.getLogin_hint()) + .state(new BigInteger(50, new SecureRandom()).toString(16)) + .nonce(new BigInteger(50, new SecureRandom()).toString(16)) + .lti_message_hint(loginRequest.getLti_message_hint()).build(); + + final URI uri = new URI(loginRequest.getTarget_link_uri()); + + // save in session + this.oidcLaunchSession.setState(loginResponse.getState()); + this.oidcLaunchSession.setNonce(loginResponse.getNonce()); + this.oidcLaunchSession.setTargetLinkUri(loginResponse.getRedirect_uri()); + + // return url + return AuthRequestUrlBuilder.build(toolDefinition.getOidcAuthUrl(), loginResponse); + } +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/ToolBuilders.java b/src/main/java/edu/uoc/elc/lti/tool/ToolBuilders.java index 8d74b75..974d1e1 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/ToolBuilders.java +++ b/src/main/java/edu/uoc/elc/lti/tool/ToolBuilders.java @@ -1,18 +1,16 @@ -package edu.uoc.elc.lti.tool; - -import edu.uoc.lti.accesstoken.AccessTokenRequestBuilder; -import edu.uoc.lti.clientcredentials.ClientCredentialsTokenBuilder; -import edu.uoc.lti.deeplink.DeepLinkingTokenBuilder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * @author xaracil@uoc.edu - */ -@RequiredArgsConstructor -@Getter -public class ToolBuilders { - private final ClientCredentialsTokenBuilder clientCredentialsTokenBuilder; - private final AccessTokenRequestBuilder accessTokenRequestBuilder; - private final DeepLinkingTokenBuilder deepLinkingTokenBuilder; -} +package edu.uoc.elc.lti.tool; + +import edu.uoc.lti.accesstoken.AccessTokenRequestBuilder; +import edu.uoc.lti.clientcredentials.ClientCredentialsTokenBuilder; +import edu.uoc.lti.deeplink.DeepLinkingTokenBuilder; +import lombok.Value; + +/** + * @author xaracil@uoc.edu + */ +@Value +public class ToolBuilders { + ClientCredentialsTokenBuilder clientCredentialsTokenBuilder; + AccessTokenRequestBuilder accessTokenRequestBuilder; + DeepLinkingTokenBuilder deepLinkingTokenBuilder; +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/ToolDefinition.java b/src/main/java/edu/uoc/elc/lti/tool/ToolDefinition.java index 6ff0a34..e482b05 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/ToolDefinition.java +++ b/src/main/java/edu/uoc/elc/lti/tool/ToolDefinition.java @@ -1,21 +1,21 @@ -package edu.uoc.elc.lti.tool; - -import lombok.Builder; -import lombok.Getter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Builder -public class ToolDefinition { - private String clientId; - private String name; - private String platform; - private String keySetUrl; - private String accessTokenUrl; - private String oidcAuthUrl; - private String privateKey; - private String publicKey; - private String deploymentId; -} +package edu.uoc.elc.lti.tool; + +import lombok.Builder; +import lombok.Value; + +/** + * @author xaracil@uoc.edu + */ +@Value +@Builder +public class ToolDefinition { + String clientId; + String name; + String platform; + String keySetUrl; + String accessTokenUrl; + String oidcAuthUrl; + String privateKey; + String publicKey; + String deploymentId; +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/User.java b/src/main/java/edu/uoc/elc/lti/tool/User.java index 56a4c19..1b6e0d0 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/User.java +++ b/src/main/java/edu/uoc/elc/lti/tool/User.java @@ -1,21 +1,19 @@ -package edu.uoc.elc.lti.tool; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -@Builder -public class User { - private String id; - private String givenName; - private String familyName; - private String middleName; - private String picture; - private String email; - private String name; -} +package edu.uoc.elc.lti.tool; + +import lombok.Builder; +import lombok.Data; + +/** + * @author xaracil@uoc.edu + */ +@Data +@Builder +public class User { + private String id; + private String givenName; + private String familyName; + private String middleName; + private String picture; + private String email; + private String name; +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java b/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java index 6e2f68f..0a97da8 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java +++ b/src/main/java/edu/uoc/elc/lti/tool/deeplinking/Settings.java @@ -1,23 +1,21 @@ -package edu.uoc.elc.lti.tool.deeplinking; - -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author xaracil@uoc.edu - */ -@Getter -@Setter -public class Settings { - private List accept_types; - private List accept_media_types; - private List accept_presentation_document_targets; - private boolean accept_multiple; - private boolean auto_create; - private String title; - private String text; - private String data; - private String deep_link_return_url; -} +package edu.uoc.elc.lti.tool.deeplinking; + +import java.util.List; + +import lombok.Data; + +/** + * @author xaracil@uoc.edu + */ +@Data +public class Settings { + private List accept_types; + private List accept_media_types; + private List accept_presentation_document_targets; + private boolean accept_multiple; + private boolean auto_create; + private String title; + private String text; + private String data; + private String deep_link_return_url; +} diff --git a/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java b/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java index a0945bc..2717aaf 100644 --- a/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java +++ b/src/main/java/edu/uoc/elc/lti/tool/validator/LTIResourceLinkLaunchValidatable.java @@ -1,116 +1,124 @@ -package edu.uoc.elc.lti.tool.validator; - -import edu.uoc.elc.lti.tool.ResourceLink; -import edu.uoc.elc.lti.tool.ToolDefinition; -import edu.uoc.lti.MessageTypesEnum; -import edu.uoc.lti.claims.ClaimAccessor; -import edu.uoc.lti.claims.ClaimsEnum; -import edu.uoc.lti.oidc.OIDCLaunchSession; -import lombok.RequiredArgsConstructor; - -/** - * @author xaracil@uoc.edu - */ -@RequiredArgsConstructor -public class LTIResourceLinkLaunchValidatable extends LTICoreValidator { - private static final int ID_MAX_LENGTH = 255; - - @Override - public boolean validate(String state, ToolDefinition toolDefinition, ClaimAccessor claimAccessor, OIDCLaunchSession oidcLaunchSession) { - // Core validation - if (!super.validate(state, toolDefinition, claimAccessor, oidcLaunchSession)) { - return false; - } - - // LTI required claims - if (!validateRequiredClaims(state, toolDefinition, claimAccessor, oidcLaunchSession)) { - return false; - } - - // LTI optional claims - if (!validateOptionalClaims()) { - return false; - } - - // state - if (state != null) { - if (!state.equals(oidcLaunchSession.getState())) { - reason = "Invalid state"; - return false; - } - if (claimAccessor.get(ClaimsEnum.NONCE) != null) { - if (!claimAccessor.get(ClaimsEnum.NONCE).equals(oidcLaunchSession.getNonce())) { - setReasonToInvalidClaim(ClaimsEnum.NONCE); - return false; - } - } - } - return true; - } - - /** - * Validates the required claims of the LTI launch following https://www.imsglobal.org/spec/lti/v1p3/#required-message-claims - * @param state saved state, if present - * @return true if the required claims of the LTI launch are valid, false otherwise - */ - private boolean validateRequiredClaims(String state, ToolDefinition toolDefinition, ClaimAccessor claimAccessor, OIDCLaunchSession oidcLaunchSession) { - // 5.3.1 message type claim - final String messageTypeClaim = claimAccessor.get(ClaimsEnum.MESSAGE_TYPE); - final MessageTypesEnum messageType = MessageTypesEnum.valueOf(messageTypeClaim); - if (messageType != MessageTypesEnum.LtiResourceLinkRequest) { - setReasonToInvalidClaim(ClaimsEnum.MESSAGE_TYPE); - return false; - } - - // 5.3.2 version (already in core) - // 5.3.3 LTI Deployment ID claim (already in core) - - // 5.3.4 Target Link URI - if (state != null) { - final String targetLinkUri = claimAccessor.get(ClaimsEnum.TARGET_LINK_URI); - if (isEmpty(targetLinkUri)) { - setReasonToMissingRequiredClaim(ClaimsEnum.TARGET_LINK_URI); - return false; - } - final String targetLinkUriFromOidcSession = oidcLaunchSession.getTargetLinkUri(); - if (!targetLinkUri.equals(targetLinkUriFromOidcSession)) { - setReasonToInvalidClaim(ClaimsEnum.TARGET_LINK_URI); - return false; - } - } - - // 5.3.5 Resource link claim - final ResourceLink resourceLink = claimAccessor.get(ClaimsEnum.RESOURCE_LINK, ResourceLink.class); - if (resourceLink == null) { - setReasonToMissingRequiredClaim(ClaimsEnum.RESOURCE_LINK); - return false; - } - - if (!isIdStringValid(resourceLink.getId())) { - setReasonToInvalidClaim(ClaimsEnum.RESOURCE_LINK); - return false; - } - - // 5.3.6 User Identity claims (already in core) - // 5.3.7 Roles claim (already in core) - - return true; - } - - /** - * Validates the optional claims of the LTI launch following https://www.imsglobal.org/spec/lti/v1p3/#optional-message-claims - * @return true if the optional claims of the LTI launch are valid, false otherwise - */ - private boolean validateOptionalClaims() { - // 5.4.1 Context claim (already in core) - // 5.4.2 Platform instance claim (already in core) - // 5.4.3 Role-scope mentor claims (already in core) - // 5.4.4 Launch presentation claim (already in core) - - // 5.4.5 Learning Information Services LIS claim: Nothing to do here - // 5.4.6 Custom properties and variable substitution: Nothing to do here (values are gotten as string in Tool) - // 5.4.7 Vendor-specific extension claims: Nothing to do here - return true; - } - -} +package edu.uoc.elc.lti.tool.validator; + +import edu.uoc.elc.lti.tool.ResourceLink; +import edu.uoc.elc.lti.tool.ToolDefinition; +import edu.uoc.lti.MessageTypesEnum; +import edu.uoc.lti.claims.ClaimAccessor; +import edu.uoc.lti.claims.ClaimsEnum; +import edu.uoc.lti.oidc.OIDCLaunchSession; +import lombok.RequiredArgsConstructor; + +/** + * @author xaracil@uoc.edu + */ +@RequiredArgsConstructor +public class LTIResourceLinkLaunchValidatable extends LTICoreValidator { + + @Override + public boolean validate(String state, ToolDefinition toolDefinition, ClaimAccessor claimAccessor, + OIDCLaunchSession oidcLaunchSession) { + // Core validation + if (!super.validate(state, toolDefinition, claimAccessor, oidcLaunchSession)) { + return false; + } + + // LTI required claims + if (!validateRequiredClaims(state, toolDefinition, claimAccessor, oidcLaunchSession)) { + return false; + } + + // LTI optional claims + if (!validateOptionalClaims()) { + return false; + } + + // state + if (state != null) { + if (!state.equals(oidcLaunchSession.getState())) { + reason = "Invalid state"; + return false; + } + if (claimAccessor.get(ClaimsEnum.NONCE) != null) { + if (!claimAccessor.get(ClaimsEnum.NONCE).equals(oidcLaunchSession.getNonce())) { + setReasonToInvalidClaim(ClaimsEnum.NONCE); + return false; + } + } + } + return true; + } + + /** + * Validates the required claims of the LTI launch following + * https://www.imsglobal.org/spec/lti/v1p3/#required-message-claims + * + * @param state saved state, if present + * @return true if the required claims of the LTI launch are valid, false + * otherwise + */ + private boolean validateRequiredClaims(String state, ToolDefinition toolDefinition, ClaimAccessor claimAccessor, + OIDCLaunchSession oidcLaunchSession) { + // 5.3.1 message type claim + final String messageTypeClaim = claimAccessor.get(ClaimsEnum.MESSAGE_TYPE); + final MessageTypesEnum messageType = MessageTypesEnum.valueOf(messageTypeClaim); + if (messageType != MessageTypesEnum.LtiResourceLinkRequest) { + setReasonToInvalidClaim(ClaimsEnum.MESSAGE_TYPE); + return false; + } + + // 5.3.2 version (already in core) + // 5.3.3 LTI Deployment ID claim (already in core) + + // 5.3.4 Target Link URI + if (state != null) { + final String targetLinkUri = claimAccessor.get(ClaimsEnum.TARGET_LINK_URI); + if (isEmpty(targetLinkUri)) { + setReasonToMissingRequiredClaim(ClaimsEnum.TARGET_LINK_URI); + return false; + } + final String targetLinkUriFromOidcSession = oidcLaunchSession.getTargetLinkUri(); + if (!targetLinkUri.equals(targetLinkUriFromOidcSession)) { + setReasonToInvalidClaim(ClaimsEnum.TARGET_LINK_URI); + return false; + } + } + + // 5.3.5 Resource link claim + final ResourceLink resourceLink = claimAccessor.get(ClaimsEnum.RESOURCE_LINK, ResourceLink.class); + if (resourceLink == null) { + setReasonToMissingRequiredClaim(ClaimsEnum.RESOURCE_LINK); + return false; + } + + if (!isIdStringValid(resourceLink.getId())) { + setReasonToInvalidClaim(ClaimsEnum.RESOURCE_LINK); + return false; + } + + // 5.3.6 User Identity claims (already in core) + // 5.3.7 Roles claim (already in core) + + return true; + } + + /** + * Validates the optional claims of the LTI launch following + * https://www.imsglobal.org/spec/lti/v1p3/#optional-message-claims + * + * @return true if the optional claims of the LTI launch are valid, false + * otherwise + */ + private boolean validateOptionalClaims() { + // 5.4.1 Context claim (already in core) + // 5.4.2 Platform instance claim (already in core) + // 5.4.3 Role-scope mentor claims (already in core) + // 5.4.4 Launch presentation claim (already in core) + + // 5.4.5 Learning Information Services LIS claim: Nothing to do here + // 5.4.6 Custom properties and variable substitution: Nothing to do here (values + // are gotten as string in Tool) + // 5.4.7 Vendor-specific extension claims: Nothing to do here + return true; + } + +} diff --git a/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java b/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java index e72b7ad..f5c021e 100644 --- a/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java +++ b/src/test/java/edu/uoc/lti/jwt/claims/TestLaunchLoader.java @@ -1,55 +1,57 @@ -package edu.uoc.lti.jwt.claims; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * @author xaracil@uoc.edu - */ -public class TestLaunchLoader { - private final static String HEADER = "header.json"; - private final static String PAYLOAD = "payload.json"; - private final static String KEEP = "keep.json"; - - private ObjectMapper mapper = new ObjectMapper(); - - public List loadTestLaunches(URI uri) { - List payloads = new ArrayList<>(); - - File directory = new File(uri); - if (directory.isDirectory()) { - final File[] files = directory.listFiles(pathname -> pathname.isDirectory()); - for (File file : files) { - try { - payloads.add(loadTestLaunch(file)); - } catch (IOException exception) { - exception.printStackTrace(); - } - } - } - return payloads; - } - - private TestLaunch loadTestLaunch(File testDirectory) throws IOException { - File headerFile = new File(testDirectory, HEADER); - File payloadFile = new File(testDirectory, PAYLOAD); - File keepFile = new File(testDirectory, KEEP); - return new TestLaunch(testDirectory.getName(), - loadJsonFileAsMap(headerFile), - loadJsonFileAsMap(payloadFile), - loadJsonFileAsList(keepFile)); - } - - private Map loadJsonFileAsMap(File file) throws IOException { - return file.exists() ? mapper.readValue(file, Map.class) : null; - } - private List loadJsonFileAsList(File file) throws IOException { - return file.exists() ? mapper.readValue(file, List.class) : null; - } -} +package edu.uoc.lti.jwt.claims; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.extern.java.Log; + +/** + * @author xaracil@uoc.edu + */ +@Log +public class TestLaunchLoader { + private final static String HEADER = "header.json"; + private final static String PAYLOAD = "payload.json"; + private final static String KEEP = "keep.json"; + + private ObjectMapper mapper = new ObjectMapper(); + + public List loadTestLaunches(URI uri) { + List payloads = new ArrayList<>(); + + File directory = new File(uri); + if (directory.isDirectory()) { + final File[] files = directory.listFiles(pathname -> pathname.isDirectory()); + for (File file : files) { + try { + payloads.add(loadTestLaunch(file)); + } catch (IOException e) { + log.warning("Cannot load test launch: " + e.getMessage()); + } + } + } + return payloads; + } + + private TestLaunch loadTestLaunch(File testDirectory) throws IOException { + File headerFile = new File(testDirectory, HEADER); + File payloadFile = new File(testDirectory, PAYLOAD); + File keepFile = new File(testDirectory, KEEP); + return new TestLaunch(testDirectory.getName(), loadJsonFileAsMap(headerFile), loadJsonFileAsMap(payloadFile), + loadJsonFileAsList(keepFile)); + } + + private Map loadJsonFileAsMap(File file) throws IOException { + return file.exists() ? mapper.readValue(file, Map.class) : null; + } + + private List loadJsonFileAsList(File file) throws IOException { + return file.exists() ? mapper.readValue(file, List.class) : null; + } +} From 73620ae2119497b9171c2a7a3344adae5e70aa6e Mon Sep 17 00:00:00 2001 From: heutelbeck Date: Wed, 26 Feb 2020 21:11:55 +0100 Subject: [PATCH 6/7] fixed configuration of JDK selection --- pom.xml | 161 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 80 insertions(+), 81 deletions(-) diff --git a/pom.xml b/pom.xml index 62ea9eb..2d6ec38 100644 --- a/pom.xml +++ b/pom.xml @@ -1,81 +1,80 @@ - - 4.0.0 - - edu.uoc.elc.lti - lti-1.3 - jar - - lti - 0.0.2 - http://maven.apache.org - - - UTF-8 - UTF-8 - 1.8 - 1.8 - - - - - edu.uoc.elc.lti - lti-1.3-core - 0.0.2 - - - com.fasterxml.jackson.core - jackson-databind - 2.9.10.1 - - - org.projectlombok - lombok - 1.18.12 - provided - - - junit - junit - 4.12 - test - - - org.mockito - mockito-core - 3.2.4 - - - edu.uoc.elc.lti - lti-1.3-jwt - 0.0.2 - test - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - 2.9.0 - - - commons-io - commons-io - 2.6 - compile - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - - - - - + + 4.0.0 + + edu.uoc.elc.lti + lti-1.3 + jar + + lti + 0.0.2 + http://maven.apache.org + + + UTF-8 + UTF-8 + 1.8 + + + + + edu.uoc.elc.lti + lti-1.3-core + 0.0.2 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.10.1 + + + org.projectlombok + lombok + 1.18.12 + provided + + + junit + junit + 4.12 + test + + + org.mockito + mockito-core + 3.2.4 + + + edu.uoc.elc.lti + lti-1.3-jwt + 0.0.2 + test + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.9.0 + + + commons-io + commons-io + 2.6 + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + + From 5bc6ab6cbd6fa0770be99d597867e1cbd303b135 Mon Sep 17 00:00:00 2001 From: heutelbeck Date: Wed, 26 Feb 2020 21:15:55 +0100 Subject: [PATCH 7/7] typo fix --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2d6ec38..82895cc 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,7 @@ 3.8.1 ${java.version} - ${java.version} + ${java.version}