From fd21264cac25c6f5e368e256b018fef2ed4869c4 Mon Sep 17 00:00:00 2001 From: Matthew Buckett Date: Mon, 2 Feb 2026 15:45:34 +0000 Subject: [PATCH 1/2] Allow Masquerading as a LTI user. This allows a LTI user to be masqueraded as which is always available. --- .../edu/ksu/canvas/constants/CanvasConstants.java | 1 + src/main/java/edu/ksu/canvas/impl/BaseImpl.java | 12 ++++++++++++ .../edu/ksu/canvas/interfaces/CanvasReader.java | 2 ++ .../edu/ksu/canvas/interfaces/CanvasWriter.java | 2 ++ .../ksu/canvas/tests/course/UserManagerUTest.java | 13 +++++++++++++ .../ksu/canvas/tests/user/UserRetrieverUTest.java | 15 +++++++++++++++ 6 files changed, 45 insertions(+) diff --git a/src/main/java/edu/ksu/canvas/constants/CanvasConstants.java b/src/main/java/edu/ksu/canvas/constants/CanvasConstants.java index fa9ce9ba..1d73e9f2 100644 --- a/src/main/java/edu/ksu/canvas/constants/CanvasConstants.java +++ b/src/main/java/edu/ksu/canvas/constants/CanvasConstants.java @@ -5,6 +5,7 @@ public class CanvasConstants { public static final String ACCOUNT_ID="1"; public static final String MASQUERADE_SIS_USER="sis_user_id"; public static final String MASQUERADE_CANVAS_USER="canvas_user_id"; + public static final String MASQUERADE_LTI_USER="lti_1_3_id"; public static final String URLENCODING_TYPE = "UTF-8"; } diff --git a/src/main/java/edu/ksu/canvas/impl/BaseImpl.java b/src/main/java/edu/ksu/canvas/impl/BaseImpl.java index fb6e31d8..dd99cfd6 100644 --- a/src/main/java/edu/ksu/canvas/impl/BaseImpl.java +++ b/src/main/java/edu/ksu/canvas/impl/BaseImpl.java @@ -98,6 +98,11 @@ public READERTYPE readAsCanvasUser(String masqueradeAs) { public READERTYPE readAsSisUser(String masqueradeAs) { return (READERTYPE) readAsUser(masqueradeAs, CanvasConstants.MASQUERADE_SIS_USER); } + + @Override + public READERTYPE readAsLtiUser(String masqueradeAs) { + return (READERTYPE) readAsUser(masqueradeAs, CanvasConstants.MASQUERADE_LTI_USER); + } private READERTYPE readAsUser(String masqueradeAs, String masqueradeType){ this.masqueradeAs = masqueradeAs; @@ -114,6 +119,11 @@ public WRITERTYPE writeAsCanvasUser(String masqueradeAs) { public WRITERTYPE writeAsSisUser(String masqueradeAs) { return (WRITERTYPE) writeAsUser(masqueradeAs, CanvasConstants.MASQUERADE_SIS_USER); } + + @Override + public WRITERTYPE writeAsLtiUser(String masqueradeAs) { + return (WRITERTYPE) writeAsUser(masqueradeAs, CanvasConstants.MASQUERADE_LTI_USER); + } private WRITERTYPE writeAsUser(String masqueradeAs, String masqueradeType){ this.masqueradeAs = masqueradeAs; @@ -139,6 +149,8 @@ protected String buildCanvasUrl(String canvasMethod, Map> p allParameters.put("as_user_id", Arrays.asList(masqueradeAs)); } else if(CanvasConstants.MASQUERADE_SIS_USER.equals(masqueradeType)) { allParameters.put("as_user_id", Arrays.asList("sis_user_id:" + masqueradeAs)); + } else if(CanvasConstants.MASQUERADE_LTI_USER.equals(masqueradeType)) { + allParameters.put("as_user_id", Arrays.asList("lti_1_3_id:" + masqueradeAs)); } //Since masquerading options are added on a per-call basis, blank them out after using them for this call masqueradeAs = null; diff --git a/src/main/java/edu/ksu/canvas/interfaces/CanvasReader.java b/src/main/java/edu/ksu/canvas/interfaces/CanvasReader.java index ee582ad5..71696cae 100644 --- a/src/main/java/edu/ksu/canvas/interfaces/CanvasReader.java +++ b/src/main/java/edu/ksu/canvas/interfaces/CanvasReader.java @@ -15,5 +15,7 @@ public interface CanvasReader { READERTYPE readAsCanvasUser(String masqueradeAs); READERTYPE readAsSisUser(String masqueradeAs); + + READERTYPE readAsLtiUser(String masqueradeAs); } diff --git a/src/main/java/edu/ksu/canvas/interfaces/CanvasWriter.java b/src/main/java/edu/ksu/canvas/interfaces/CanvasWriter.java index 7209c7b6..6d39144d 100644 --- a/src/main/java/edu/ksu/canvas/interfaces/CanvasWriter.java +++ b/src/main/java/edu/ksu/canvas/interfaces/CanvasWriter.java @@ -5,5 +5,7 @@ public interface CanvasWriter { WRITERTYPE writeAsCanvasUser(String masqueradeAs); WRITERTYPE writeAsSisUser(String masqueradeAs); + + WRITERTYPE writeAsLtiUser(String masqueradeAs); } diff --git a/src/test/java/edu/ksu/canvas/tests/course/UserManagerUTest.java b/src/test/java/edu/ksu/canvas/tests/course/UserManagerUTest.java index 8ff942e3..1ccded3d 100644 --- a/src/test/java/edu/ksu/canvas/tests/course/UserManagerUTest.java +++ b/src/test/java/edu/ksu/canvas/tests/course/UserManagerUTest.java @@ -70,5 +70,18 @@ public void testCanvasUserMasqueradeCreateUser() throws IOException { Assert.assertEquals("somestring4",response.get().getName()); Assert.assertNotNull(response.get().getId()); } + @Test + public void testLtiUserMasqueradeCreateUser() throws IOException { + User user = new User(); + String userId = "899123456"; + user.setName("somestring4"); + user.setLoginId("somestring4"); + String url = baseUrl + "/api/v1/accounts/1/users?as_user_id=" + CanvasConstants.MASQUERADE_LTI_USER + ":" + userId; + fakeRestClient.addSuccessResponse(url, "SampleJson/CreateUserResponse.json"); + Optional response = userWriter.writeAsLtiUser(userId).createUser(user); + System.out.println(response.toString()); + Assert.assertEquals("somestring4",response.get().getName()); + Assert.assertNotNull(response.get().getId()); + } } diff --git a/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java b/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java index ae8d3766..b0abe2be 100644 --- a/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java +++ b/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java @@ -82,6 +82,21 @@ public void testCanvasUserMasqueradeListCourseQuizzes() throws Exception { Assert.assertTrue(users.stream().map(User::getName).filter("Student Number 2"::equals).findFirst().isPresent()); } + @Test + public void testLtiUserMasqueradeListCourseQuizzes() throws Exception { + String someUserId = "8991123123"; + Response notErroredResponse = new Response(); + notErroredResponse.setErrorHappened(false); + notErroredResponse.setResponseCode(200); + String url = baseUrl + "/api/v1/courses/" + someCourseId + "/users?as_user_id=" + CanvasConstants.MASQUERADE_LTI_USER + ":" + someUserId; + fakeRestClient.addSuccessResponse(url, "SampleJson/user/UserList.json"); + + List users = userReader.readAsLtiUser(someUserId).getUsersInCourse(new GetUsersInCourseOptions(someCourseId)); + Assert.assertEquals(2, users.size()); + Assert.assertTrue(users.stream().map(User::getName).filter("Student Number 1"::equals).findFirst().isPresent()); + Assert.assertTrue(users.stream().map(User::getName).filter("Student Number 2"::equals).findFirst().isPresent()); + } + @Test public void testShowUserDetailsByUserId() throws Exception { int userId = 20; From a31d916e9b020a43d81e641932ca5e7c402d0802 Mon Sep 17 00:00:00 2001 From: Matthew Buckett Date: Mon, 2 Feb 2026 16:15:20 +0000 Subject: [PATCH 2/2] Remove unused code. --- .../ksu/canvas/tests/user/UserRetrieverUTest.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java b/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java index b0abe2be..4536376d 100644 --- a/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java +++ b/src/test/java/edu/ksu/canvas/tests/user/UserRetrieverUTest.java @@ -7,7 +7,6 @@ import edu.ksu.canvas.interfaces.UserWriter; import edu.ksu.canvas.model.User; import edu.ksu.canvas.net.FakeRestClient; -import edu.ksu.canvas.net.Response; import edu.ksu.canvas.requestOptions.GetUsersInAccountOptions; import edu.ksu.canvas.requestOptions.GetUsersInCourseOptions; import edu.ksu.canvas.util.CanvasURLBuilder; @@ -38,9 +37,6 @@ public void setupData() { @Test public void testListCourseQuizzes() throws Exception { - Response notErroredResponse = new Response(); - notErroredResponse.setErrorHappened(false); - notErroredResponse.setResponseCode(200); String url = CanvasURLBuilder.buildCanvasUrl(baseUrl, apiVersion, "courses/" + someCourseId + "/users", Collections.emptyMap()); fakeRestClient.addSuccessResponse(url, "SampleJson/user/UserList.json"); @@ -54,9 +50,6 @@ public void testListCourseQuizzes() throws Exception { @Test public void testSisUserMasqueradeListCourseQuizzes() throws Exception { String someUserId = "8991123123"; - Response notErroredResponse = new Response(); - notErroredResponse.setErrorHappened(false); - notErroredResponse.setResponseCode(200); String url = baseUrl + "/api/v1/courses/" + someCourseId + "/users?as_user_id=" + CanvasConstants.MASQUERADE_SIS_USER + ":" + someUserId; fakeRestClient.addSuccessResponse(url, "SampleJson/user/UserList.json"); @@ -70,9 +63,6 @@ public void testSisUserMasqueradeListCourseQuizzes() throws Exception { @Test public void testCanvasUserMasqueradeListCourseQuizzes() throws Exception { String someUserId = "8991123123"; - Response notErroredResponse = new Response(); - notErroredResponse.setErrorHappened(false); - notErroredResponse.setResponseCode(200); String url = baseUrl + "/api/v1/courses/" + someCourseId + "/users?as_user_id=" + someUserId; fakeRestClient.addSuccessResponse(url, "SampleJson/user/UserList.json"); @@ -85,9 +75,6 @@ public void testCanvasUserMasqueradeListCourseQuizzes() throws Exception { @Test public void testLtiUserMasqueradeListCourseQuizzes() throws Exception { String someUserId = "8991123123"; - Response notErroredResponse = new Response(); - notErroredResponse.setErrorHappened(false); - notErroredResponse.setResponseCode(200); String url = baseUrl + "/api/v1/courses/" + someCourseId + "/users?as_user_id=" + CanvasConstants.MASQUERADE_LTI_USER + ":" + someUserId; fakeRestClient.addSuccessResponse(url, "SampleJson/user/UserList.json");