Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r8b469ff18d080eb020107ad2b0de5ad6b887854c -r04324aeb5a29d6d1748ef57d871f24003fd32502 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java =================================================================== diff -u -r4f588a8a76672ba3faa1f8149b95f5a5f5bf0d62 -r04324aeb5a29d6d1748ef57d871f24003fd32502 --- lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 4f588a8a76672ba3faa1f8149b95f5a5f5bf0d62) +++ lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 04324aeb5a29d6d1748ef57d871f24003fd32502) @@ -30,6 +30,7 @@ import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.integration.ExtCourseClassMap; import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; @@ -111,33 +112,40 @@ } } - ExtServerOrgMap serverMap = getService().getExtServerOrgMap(serverId); + ExtServerOrgMap serverMap = getIntegrationService().getExtServerOrgMap(serverId); boolean prefix = (usePrefix == null) ? true : Boolean.parseBoolean(usePrefix); try { ExtUserUseridMap userMap = null; if ((firstName == null) && (lastName == null)) { - userMap = getService().getExtUserUseridMap(serverMap, extUsername, prefix); + userMap = getIntegrationService().getExtUserUseridMap(serverMap, extUsername, prefix); } else { - userMap = getService().getImplicitExtUserUseridMap(serverMap, extUsername, firstName, lastName, - langIsoCode, countryIsoCode, email, prefix, isUpdateUserDetails); + userMap = getIntegrationService().getImplicitExtUserUseridMap(serverMap, extUsername, firstName, + lastName, langIsoCode, countryIsoCode, email, prefix, isUpdateUserDetails); } //in case of request for learner with strict authentication check cache should also contain lsid - String lsId = null; - if (LoginRequestDispatcher.METHOD_LEARNER_STRICT_AUTHENTICATION.equals(method)) { + String lsId = request.getParameter(LoginRequestDispatcher.PARAM_LESSON_ID); + if (LoginRequestDispatcher.METHOD_LEARNER_STRICT_AUTHENTICATION.equals(method) && lsId == null) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Login Failed - lsId parameter missing"); + return; + } + Authenticator.authenticateLoginRequest(serverMap, timestamp, extUsername, method, lsId, hash); - lsId = request.getParameter(LoginRequestDispatcher.PARAM_LESSON_ID); - if (lsId == null) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Login Failed - lsId parameter missing"); - return; + if (extCourseId == null && lsId != null) { + // derive course ID from lesson ID + ExtCourseClassMap classMap = integrationService.getExtCourseClassMap(serverMap.getSid(), + Long.parseLong(lsId)); + if (classMap == null) { + log.warn("Lesson " + lsId + " is not mapped to any course for server " + serverMap.getServername()); + } else { + extCourseId = classMap.getCourseid(); } } - Authenticator.authenticateLoginRequest(serverMap, timestamp, extUsername, method, lsId, hash); if (extCourseId != null) { // check if organisation, ExtCourseClassMap and user roles exist and up-to-date, and if not update them - getService().getExtCourseClassMap(serverMap, userMap, extCourseId, countryIsoCode, langIsoCode, - courseName, method, prefix); + getIntegrationService().getExtCourseClassMap(serverMap, userMap, extCourseId, countryIsoCode, + langIsoCode, courseName, method, prefix); } User user = userMap.getUser(); @@ -198,7 +206,7 @@ doGet(request, response); } - private IntegrationService getService() { + private IntegrationService getIntegrationService() { if (LoginRequestServlet.integrationService == null) { LoginRequestServlet.integrationService = (IntegrationService) WebApplicationContextUtils .getRequiredWebApplicationContext(getServletContext()).getBean("integrationService"); Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java =================================================================== diff -u -r5773f84ed608838de3521ecde87c52f3c72d478c -r04324aeb5a29d6d1748ef57d871f24003fd32502 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 5773f84ed608838de3521ecde87c52f3c72d478c) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 04324aeb5a29d6d1748ef57d871f24003fd32502) @@ -27,6 +27,7 @@ import java.util.List; import org.lamsfoundation.lams.integration.ExtCourseClassMap; +import org.lamsfoundation.lams.integration.ExtServerLessonMap; import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtServerToolAdapterMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; @@ -164,4 +165,6 @@ boolean isIntegratedServerGroupFetchingAvailable(Long lessonId); List getExtGroups(Long lessonId, String[] extGroupIds) throws Exception; + + ExtCourseClassMap getExtCourseClassMap(Integer sid, Long lessonId); } Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== diff -u -r866c3b2bee40757fd08d9a0b4851e20bb0e40228 -r04324aeb5a29d6d1748ef57d871f24003fd32502 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 866c3b2bee40757fd08d9a0b4851e20bb0e40228) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 04324aeb5a29d6d1748ef57d871f24003fd32502) @@ -740,7 +740,18 @@ return extGroups; } - + + @Override + @SuppressWarnings("unchecked") + public ExtCourseClassMap getExtCourseClassMap(Integer sid, Long lessonId) { + Lesson lesson = lessonService.getLesson(lessonId); + Map properties = new HashMap(); + properties.put("extServerOrgMap.sid", sid); + properties.put("organisation.organisationId", lesson.getOrganisation().getOrganisationId()); + List list = service.findByProperties(ExtCourseClassMap.class, properties); + return list == null || list.isEmpty() ? null : list.get(0); + } + private ExtServerLessonMap getExtServerLessonMap(Long lessonId) { List list = service.findByProperty(ExtServerLessonMap.class, "lessonId", lessonId); if ((list == null) || (list.size() == 0)) {